結果
| 問題 |
No.20 砂漠のオアシス
|
| コンテスト | |
| ユーザー |
yuma25689
|
| 提出日時 | 2015-10-31 03:16:56 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,957 bytes |
| コンパイル時間 | 117 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 29,348 KB |
| 最終ジャッジ日時 | 2024-10-13 05:29:58 |
| 合計ジャッジ時間 | 7,003 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 5 TLE * 1 -- * 15 |
ソースコード
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')
yuma25689