ここで説明されている装置の問題を解決しようとしています。解決策はありますが、制限時間である2秒以上かかります。コードを最適化して速度を上げようとしましたが、2 秒の制限内で取得できません。
import sys
import math
for line in sys.stdin:
line = line.strip("\n").split(" ")
numSwitches = int(line[0])
numPics = int(line[1])
wiring = {}
inValid = False
for i in range(numPics):
if (inValid):
break
x = sys.stdin.readline().strip("\n")
f_x = sys.stdin.readline().strip("\n")
x_ones = 0
f_x_ones = 0
digit = 0
for i in range(numSwitches):
if f_x[i]=='1':
digit += 2**(numSwitches-i-1)
f_x_ones += 1
for switch in range(numSwitches):
if (x[switch]=='1'):
x_ones += 1
if not (switch in wiring.keys()):
wiring[switch] = digit
else:
wiring[switch] &= digit
if x_ones != f_x_ones:
inValid = True
break
if not inValid:
for i in wiring.values():
if i==0:
inValid = True
break
for possibilities in set(wiring.values()):
frequency = wiring.values().count(possibilities)
if frequency>1:
oneBits = 0
while (possibilities>0):
oneBits += (possibilities%2==1)
possibilities /= 2
if oneBits < frequency:
inValid = True
break
if not inValid:
print math.factorial(numSwitches-numPics)%1000003
else:
print 0
問題に取り組むべきだった方法の提案や、現在のコードを最適化する方法についての情報を探しています。
注: 次のテスト ケースを検討してください。
3 2
110
011
011
011
私のコードは、次の方法で無効であることがわかりました。まず、最初の写真(110、011)に遭遇したとき。配線辞書には、次のキーと値が割り当てられます。
wiring[0] = 011
wiring[1] = 011
これは、1 番目と 2 番目のスイッチが 2 番目または 3 番目のライトのいずれかを点灯できることを意味します。2枚目の写真(011、011)に遭遇。配線は次のように更新されます。
wiring[1] = 011 & 011 = 011
wiring[2] = 011
ここで、配線の状態が、3 つのスイッチすべてが 2 番目と 3 番目のライトのいずれかを点灯できることを示していることを確認します。3 つのスイッチが 3 つのライトを点灯する必要があるため、これは矛盾しています。ここでは、2 つのライトを点灯する 3 つのスイッチがあります。