結果
問題 | No.5017 Tool-assisted Shooting |
ユーザー |
|
提出日時 | 2023-07-16 17:47:24 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 4,824 bytes |
コンパイル時間 | 259 ms |
コンパイル使用メモリ | 87,184 KB |
実行使用メモリ | 102,420 KB |
スコア | 0 |
最終ジャッジ日時 | 2023-07-16 17:47:31 |
合計ジャッジ時間 | 6,690 ms |
ジャッジサーバーID (参考情報) |
judge11 / judge16 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | TLE * 1 -- * 99 |
ソースコード
import timetimer = time.perf_counter()output = []class enemy():def __init__(self, hp, power, pos):self.hp = hp + 1self.power = powerself.point = hpself.exp = powerself.pos = [pos, 60]def move(self, p):self.pos[1] -= 1if p.pos[0] == self.pos[0] and p.pos[1] == self.pos[1]:return Falsereturn Truedef state(self):print("HP:{} POWER:{} POS:{}".format(self.hp, self.power, self.pos))class enemys():def __init__(self):self.enemys = []self.deleted = []from collections import dequeself.canattacks = [deque() for _ in range(25)]def states(self):for e in self.enemys:e.state()def expect_defeat_values(self, p):# ret = []min_ = ([], 1 << 60)for i in range(25):if not self.canattacks[i]:continuei = self.canattacks[i][0]e = self.enemys[i]t = abs(p.pos[0] - e.pos[0]) + int(e.hp / p.level)if e.hp % p.level != 0:t += 1t += 1if t >= e.pos[1]:continueif min_[1] <= t:continueif p.pos[0] < e.pos[0]:que = [1] * (e.pos[0] - p.pos[0])else:que = [-1] * (p.pos[0] - e.pos[0])if e.pos[1] < len(que):continueisok = Truepos = [p.pos[0], p.pos[1]]for d in que:pos[1] += 1pos[0] += dif pos[0] < 0:pos[0] += 25pos[0] = pos[0] % 25for c in self.canattacks[pos[0]]:e_ = self.enemys[c]if abs(e_.pos[1] - pos[1]) <= 2:isok = Falsebreakif not isok:breakif isok:min_ = (que, t)# ret.append((que, v))return min_def add(self, enemy):if self.deleted:i = self.deleted.pop()else:i = len(self.enemys)self.enemys.append([])self.enemys[i] = enemyself.canattacks[enemy.pos[0]].append(i)def defeat(self, i):for j in range(25):if not self.canattacks[j]:continueif i == self.canattacks[j][0]:self.canattacks[j].popleft()self.deleted.append(i)returndef move(self, p):delque = []for canattack in self.canattacks:for i in canattack:e = self.enemys[i]b = e.move(p)if not b:return Falseif e.pos[1] < 1:delque.append(i)for i in delque:self.canattacks[self.enemys[i].pos[0]].popleft()self.deleted.append(i)return Trueclass player():def __init__(self):self.pos = [12, 0]self.level = 1self.exp = 0self.point = 0def states(self):print("POS:{} LEVEL:{} EXP:{} POINT:{}".format(self.pos, self.level, self.exp, self.point))def attack(self, enemys: enemys):if not enemys.canattacks[self.pos[0]]:returni = enemys.canattacks[self.pos[0]][0]e = enemys.enemys[i]e.hp -= self.levelif e.hp <= 0:enemys.defeat(i)self.exp += e.expself.level = 1 + int(self.exp / 100)self.point += e.pointdef move(self, dir, enemys: enemys):dstr = "S"if dir == -1:dstr = "L"if dir == 1:dstr = "R"output.append(dstr)self.pos[0] += dirif self.pos[0] < 0:self.pos[0] + 25self.pos[0] = self.pos[0] % 25if enemys.canattacks[self.pos[0]]:if enemys.enemys[enemys.canattacks[self.pos[0]][0]].pos[1] == 0:return Falsereturn Truees = enemys()p = player()while len(output) < 1000:for i in range(int(input())):inp = input().split()if int(inp[0]) == -1:breakes.add(enemy(*map(int, inp)))que, _ = es.expect_defeat_values(p)p.attack(es)m = 0if que:m = que.pop()if not p.move(m, es):breakif not es.move(p):break# es.states()# p.states()for o in output:print(o)# def text(output):# import os# os.remove("output.txt")# with open("output.txt", "w") as o:# for out in output:# print(out, file=o)# text(output)