結果
問題 | No.20 砂漠のオアシス |
ユーザー | yuma25689 |
提出日時 | 2015-10-31 03:16:56 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,957 bytes |
コンパイル時間 | 117 ms |
コンパイル使用メモリ | 12,928 KB |
実行使用メモリ | 29,348 KB |
最終ジャッジ日時 | 2024-10-13 05:29:58 |
合計ジャッジ時間 | 7,003 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 29 ms
10,880 KB |
testcase_01 | AC | 30 ms
11,008 KB |
testcase_02 | AC | 31 ms
10,880 KB |
testcase_03 | AC | 70 ms
11,392 KB |
testcase_04 | AC | 69 ms
11,648 KB |
testcase_05 | TLE | - |
testcase_06 | -- | - |
testcase_07 | -- | - |
testcase_08 | -- | - |
testcase_09 | -- | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
ソースコード
import sys import heapq INF=1e10 class Node: ''' このdijkstra法で使用するnode ''' def __init__(self,x,y,fc,tc,to): self.x=x self.y=y self.minFromCost=fc self.toCost=tc self.to=to self.done=False def __eq__(self,n): return self.x == n.x and self.y == n.y def __lt__(self,n): return self.minFromCost < n.minFromCost def clear(self): self.minFromCost=INF self.done=False def updateCostByDijkstra(firstNode,nodeList,targetNodes=None): ''' firstNodeからのnodeList内の全ノードに対して移動するのにかかるコストを取得 ただし、dijkstra法なので、0<=cost ''' queue=[] heapq.heapify(queue) heapq.heappush( queue, firstNode ) getTarget=False while 0 < len(queue): # キューが空でない限り # キュー取り出し doneNode=heapq.heappop(queue) doneNode.done=True if targetNodes: getTarget=True for t in targetNodes: if not t.done: getTarget=False break if getTarget: return for i in doneNode.to: if nodeList[i].done==True: continue # 接続先ノードを更新 current = doneNode.minFromCost + nodeList[i].toCost if nodeList[i].minFromCost == INF or current < nodeList[i].minFromCost: nodeList[i].minFromCost = current if nodeList[i] not in queue: # 参照渡しの必要あり。pythonではそれで普通かな? heapq.heappush( queue, nodeList[i] ) # print( "[" + str(doneNode.x) + "," + str(doneNode.y) + "]" + "->[" + str(nodeList[i].x) + "," + str(nodeList[i].y) \ # + "]"+"="+str(nodeList[i].minFromCost) + "(" + str(nodeList[i].toCost) +")") line=sys.stdin.readline() line1=line.split() edgeCount = int(line1[0]) HP=int(line1[1]) oasisPos=[int(line1[2]),int(line1[3])] damageOfPos=[[0 for i in range(edgeCount)] for j in range(edgeCount)] # 各点から目的地までの最小コスト for y in range(edgeCount): line=sys.stdin.readline() lineN=line.split() for x in range(edgeCount): damageOfPos[x][y]=int(lineN[x]) # Dijkstra #minFromCost=[[INF for i in range(edgeCount)]for j in range(edgeCount)] NextCoords=[(1,0),(0,1),(-1,0),(0,-1)] # nodeを作成 # 接続先情報も上下左右として作成する nodes=[] for x in range(edgeCount): for y in range(edgeCount): toNodeInduces=[] for i in range(len(NextCoords)): (dx,dy)=NextCoords[i] to_x=x+dx to_y=y+dy if 0 <=to_x<edgeCount and 0<=to_y<edgeCount: toNodeInduces.append( to_y + edgeCount*to_x ) nodes.append( Node(x,y,INF,damageOfPos[x][y],toNodeInduces) ) # 最初の点のコストを0に初期化 nodes[0].minFromCost=0 oasisIndex=-1 if not ( oasisPos[0]==0 and oasisPos[1]==0 ): oasisIndex=oasisPos[1]-1 + edgeCount*(oasisPos[0]-1) # 最初のnodeからdijkstra法 targets=[] targets.append(nodes[oasisIndex]) targets.append(nodes[len(nodes)-1]) updateCostByDijkstra(nodes[0],nodes,targets) # for node in nodes: # print( "[" + str(node.x) + "," + str(node.y) + "]="+str(node.minFromCost) ) if nodes[len(nodes)-1].minFromCost < HP: print('YES') sys.exit(0) # HPが足りなかった # print('HP{0} not enouph.cost{1}'.format( HP, nodes[len(nodes)-1].minFromCost) ) # オアシス経由でいけるか試す if oasisPos[0]==0 and oasisPos[1]==0: # print('not exist oasis') print('NO') sys.exit(0) # print('oasis exists [toCost]={}'.format( nodes[oasisIndex].minFromCost ) ) if nodes[oasisIndex].minFromCost < HP: HP = (HP-nodes[oasisIndex].minFromCost)*2 else: # print('cant reach oasis{} HP{}'.format( nodes[oasisIndex].minFromCost, HP)) print('NO') sys.exit(0) # print('HP recovery to {}'.format(HP)) # 最初の点をoasisにしてもう一度dijkstra for node in nodes: node.clear() nodes[oasisIndex].minFromCost=0 updateCostByDijkstra(nodes[oasisIndex],nodes,[nodes[len(nodes)-1]]) # for node in nodes: # print( "[" + str(node.x) + "," + str(node.y) + "]="+str(node.minFromCost) ) if nodes[len(nodes)-1].minFromCost < HP: print('YES') else: print('NO')