結果

問題 No.20 砂漠のオアシス
ユーザー yuma25689yuma25689
提出日時 2015-10-31 01:36:59
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
TLE  
実行時間 -
コード長 3,528 bytes
コンパイル時間 107 ms
コンパイル使用メモリ 12,800 KB
実行使用メモリ 13,632 KB
最終ジャッジ日時 2024-10-13 05:29:27
合計ジャッジ時間 6,920 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 32 ms
10,880 KB
testcase_01 AC 30 ms
10,880 KB
testcase_02 AC 32 ms
10,880 KB
testcase_03 AC 71 ms
11,648 KB
testcase_04 AC 69 ms
11,776 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 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
import heapq
INF=1e20

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):
	'''
	firstNodeからのnodeList内の全ノードに対して移動するのにかかるコストを取得
	ただし、dijkstra法なので、0<=cost
	'''
	queue=[]
	heapq.heapify(queue)
	heapq.heappush( queue, firstNode )
	minFromCost=0
	while 0 < len(queue):
		# キューが空でない限り
		# キュー取り出し
		doneNode=heapq.heappop(queue)
		doneNode.done=True

		for i in doneNode.to:
			node=nodeList[i]
			# 接続先ノードを更新
			current = doneNode.minFromCost + node.toCost
			if node.minFromCost == INF or current < node.minFromCost:
				node.minFromCost = current
				if node not in queue:
					# 参照渡しの必要あり。pythonではそれで普通かな?
					heapq.heappush( queue, node )
			#print( "[" + str(doneNode.x) + "," + str(doneNode.y) + "]" + "->[" + str(node.x) + "," + str(node.y) \
			#	+ "]"+"="+str(node.minFromCost) + "(" + str(node.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

# 最初のnodeからdijkstra法
updateCostByDijkstra(nodes[0],nodes)

# 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)

oasisIndex=oasisPos[1]-1 + edgeCount*(oasisPos[0]-1)

# 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)

# 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')


0