问题描述
从前,有一位骑士。由于非常勇敢,他决定进行一次充满战斗和冒险的长途旅行。这段旅程的地图可以表示为一行,其中有 n 个单元格,从左到右编号为 1 到 n。最初,骑士位于最左边的单元格(单元格编号 1)。他应该一个一个地通过所有的单元格,并在最右边的单元格(单元格编号 n)处完成他的路。不允许他向后移动或跳过某些单元格,他会从第一个到最后一个访问所有单元格。
除了第一个单元格之外,每个单元格都包含一条龙或一位公主。每条龙都有一个装有金币的箱子。牢房里的龙保存着gi币。每次骑士走到有龙的牢房时,他都有一个选择——杀死龙或只是穿过。骑士非常强壮灵巧,所以在他的道路上杀死任何龙对他来说都不是问题。如果一条龙被杀死,骑士将拥有所有的金龙。
当骑士带着公主走进牢房时,她想知道他杀死了多少条龙。如果这个数字大于或等于她的美眉,公主认为骑士足够勇敢,立即向他求婚。作为一个真正的绅士,骑士不能拒绝,他的冒险立即结束。
骑士喜欢住在n号牢房的公主,想娶她。同样在旅途中,他想收集尽可能多的黄金。请帮助他完成这项任务。
输入-
输入的第一行包含一个整数 n (2 ≤ n ≤ 2·105) — 单元格的数量。接下来的 n-1 行描述了从 2 到 n 的单元格。
如果单元格编号 i 包含一条龙,则输入的第 i 行包含字母 "d" 后跟一个整数 gi (1 ≤ gi ≤ 104) — 龙保留的硬币数量。字母和整数用一个空格隔开。
如果单元格编号 i 包含公主,则输入的第 i 行包含字母 "p" 后跟单个整数 bi (1 ≤ bi ≤ 2·105) — 公主的美丽。字母和整数由一个空格分隔。保证最后一个单元格包含一位公主。
输出-
在输出的第一行打印一个整数——骑士可以收集的最大金币数量。在第二行打印一个整数 k——要杀死的龙的数量。第三行应该包含 k 个整数——骑士应该杀死一条龙的单元格的数量。单元格编号应按递增顺序打印。
如果有多个最优解,输出其中任何一个。如果骑士不能娶他心爱的公主,只需在输出的第一行打印 -1。
示例:
样本输入:
6
d 10
d 12
p 2
d 1
p 2
示例输出:
13
2
3 5
样本输入:
6
d 10
d 12
p 2
d 1
p 3
示例输出:
-1
我提交了我的解决方案,但由于某种原因,它失败了,我无法访问失败的测试用例。
我希望一些新人能发现问题
我的解决方案:
class MinHeap:
def __init__(self):
self.lst = []
def insert(self,data):
self.lst.append(data)
self.heapify_up(len(self.lst) - 1)
def pop_root(self):
root = self.lst[0]
last = self.lst.pop()
if len(self.lst) > 0:
self.lst[0] = last
self.heapify_down(0,0)
return root
def heapify_down(self,parent_idx,child_idx):
if child_idx >= len(self.lst):
return
parent_greater_bool = self.lst[parent_idx] > self.lst[child_idx]
if parent_greater_bool:
self.lst[parent_idx],self.lst[child_idx] = self.lst[child_idx],self.lst[parent_idx]
if parent_greater_bool or parent_idx == 0:
self.heapify_down(child_idx,child_idx * 2 + 1)
self.heapify_down(child_idx,child_idx * 2 + 2)
def heapify_up(self,child_idx):
parent_idx = (child_idx - 1) // 2
if parent_idx < 0:
return
if self.lst[parent_idx] > self.lst[child_idx]:
self.lst[parent_idx],self.lst[parent_idx]
self.heapify_up(parent_idx)
def heap_sum(self):
return sum([d.gold for d in self.lst])
def indexes(self):
return ' '.join(sorted([str(d.index) for d in self.lst]))
def __len__(self):
return len(self.lst)
def __str__(self):
res = ''
for d in self.lst:
res += f"index: {d.index},gold: {d.gold} | "
return res
class NotValidCharacter(Exception):
pass
class Dragon:
def __init__(self,index,gold):
self.index = index
self.gold = gold
def __str__(self):
return f"index: {self.index},gold: {self.gold}"
def __lt__(self,other):
return self.gold < other.gold
def dragons_and_princesses():
heap = MinHeap()
try:
length = int(input("insert the length of the map\n"))
except ValueError:
raise ValueError("The map length must be integer")
if length < 2 or length > 200000:
while length < 2 or length > 200000:
try:
length = int(input("insert the length of the map (2 - 200,000)\n"))
except ValueError:
raise ValueError("The map length must be integer")
for i in range(1,length):
try:
character,value = input().split()
if character not in ['d','p']:
raise NotValidCharacter('You can only enter dragons and princesses')
value = int(value)
except ValueError:
raise ValueError("Make sure you enter 'd' or 'p' and following integer")
if character == 'd':
heap.insert(Dragon(i + 1,value))
if character == 'p':
if i == length - 1:
if value > len(heap):
print(-1)
else:
print(heap.heap_sum())
print(len(heap))
print(heap.indexes())
elif value <= len(heap) and i != length - 1:
while value <= len(heap):
heap.pop_root()
if __name__ == "__main__":
dragons_and_princesses()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)