微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

codeforce - 548 龙和公主

如何解决codeforce - 548 龙和公主

我正在解决一个名为“龙与公主”的问题:

从前,有一位骑士。由于非常勇敢,他决定进行一次充满战斗和冒险的长途旅行。这段旅程的地图可以表示为一行,其中有 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 举报,一经查实,本站将立刻删除。