我正在解决PEG Online Judge上的一个问题,这是一个可以解决许多练习和乐趣问题的网站。
我特别遇到麻烦。我已经在那里寻求帮助,但我没有收到任何帮助。
这是Caporegime问题:http://wcipeg.com/problem/capos
您可以使用多种语言来解决此问题。我决定使用Python(虽然我也用C ++编写了它)。法官在测试代码时使用了12个数据集。我的代码通过11/12。我不知道为什么我不能通过最后一次测试,希望有人可以帮助我。
我认为这是一种设置的分区问题,我采用广度优先搜索方法解决它。问题数据集并不大,所以它不会失控。
这是我的解决方案:
import sys
import copy
class SearchState():
def __init__(self, label, crews):
self.label = label
self.crews = crews
def __repr__(self):
return "State: %s: %s" % (self.label, str(self.crews))
def crewsSoldierCanBeIn(s, crews, grudges):
'''
For a given soldier and a list of crews and grudges,
return the crews the soldier an go in
'''
noGrudgeCrews = []
for i, crew in enumerate(crews):
conflict = False
for c in crew:
if [s, c] in grudges or [c, s] in grudges:
conflict = True
break
if not conflict:
noGrudgeCrews.append(i)
return noGrudgeCrews
def solve(numSoldiers, grudges):
'''
Put each soldier in a crew, output min no. of crews and who is in them
'''
crews = [[1]]
numStates = 0
states = [SearchState(numStates, crews)]
for s in range(2, numSoldiers+1):
newStates = []
for state in states:
possibleCrews = crewsSoldierCanBeIn(s, state.crews, grudges)
if len(possibleCrews) > 0:
for crew in possibleCrews:
numStates += 1
newCrews = copy.deepcopy(state.crews)
newCrews[crew].append(s)
newStates.append(SearchState(numStates, newCrews))
else:
numStates += 1
newCrews = copy.deepcopy(state.crews)
newCrews.append([s])
newStates.append(SearchState(numStates, newCrews))
states = copy.deepcopy(newStates)
minNumCrews = 1000000
minState = -1
for i, state in enumerate(states):
if len(state.crews) < minNumCrews:
minNumCrews = len(state.crews)
minState = i
print(len(states[minState].crews))
for crew in states[minState].crews:
for s in crew:
print("%d " % (s), end = "")
print()
def readInData(f):
numSoldiers, numGrudges = map(int, f.readline().strip().split())
grudges = []
for _ in range(numGrudges):
grudges.append(list(map(int, f.readline().strip().split())))
return numSoldiers, grudges
def main():
# Read in the data
f = sys.stdin
numSoldiers, grudges = readInData(f)
solve(numSoldiers, grudges)
if __name__ == '__main__':
main()
答案 0 :(得分:0)
好的,所以我终于解决了这个问题。
基本上我需要使用DFS方法,它可以通过BFS真正解决(通过在线Judge的内存和时间限制)。
DFS的优势有两个:1)我可以相当快地达到一个解决方案(不是最好的解决方案)并使用它来修剪树,摆脱大量的永远不会有任何好处的部分解决方案2)需要很少的记忆。
因此,对于这个问题,DFS速度更快,占用内存更少。