反悔贪心 + 优先队列:PIPI的逃跑路线Ⅳ

﹏ヽ暗。殇╰゛Y 2023-10-06 20:26 103阅读 0赞

反悔贪心 + 优先队列:PIPI的逃跑路线Ⅳ

文章目录

  • 反悔贪心 + 优先队列:PIPI的逃跑路线Ⅳ
      • 问题:
      • 思路:
      • 代码:

问题:

在这里插入图片描述
在这里插入图片描述

思路:

  最直接但错误的想法是:我们每回合开始时都可以尝试去进行攻击,这样能尽快杀死popo,如果接下来承受不住popo的进攻,我们或许可以放弃该回合的进攻,转为防守,即进行回血操作(设已经承受了popo造成的伤害attack,若奶量大于伤害,则回B点血,否则进行护卫,回attack点血)。但这种策略并不是贪心的策略,因为在不同的回合进行防守,赚的回血量不同,比如在popo的攻击为10000时,pipi没死,这回合不回血,在popo攻击为1时,pipi要死,这回合去回血,那就是亏惨了。那么最贪心的策略是什么呢?
  我们可以使用反悔贪心策略,建立反悔机制。现实游戏中我们不能反悔,但是在程序中我们可以建立反悔机制,从而把之前做过的操作更改。我们的贪心策略是不断进攻使popo尽快死亡,若pipi血量不足再进行反悔进行最赚的回血操作。那么什么时候防守回血最赚,显然是在popo攻击力最高的那个回合。我们可以用优先队列保存popo每回合的攻击力,从大到小排序(大根堆),每回合pipi都先尝试攻击popo,若接下来pipi要死,则取出队头元素attack,在popo攻击力最高的那个回合进行反悔,攻转防,若奶量大于伤害,则回B点血,否则进行护卫,回attack点血,相应的,popo也要回A点血。

代码:

  1. import java.util.*;
  2. public class Main {
  3. static PriorityQueue<Attack> q = new PriorityQueue<>();
  4. public static void main(String[] args) {
  5. int n, i;
  6. long x, y, A, B, ai, maxAttack;
  7. Scanner scanner = new Scanner(System.in);
  8. n = scanner.nextInt();
  9. x = scanner.nextLong();
  10. y = scanner.nextLong();
  11. A = scanner.nextLong();
  12. B = scanner.nextLong();
  13. for (i = 0;i < n;i++) {
  14. y -= A;
  15. if (y <= 0) {
  16. break;
  17. }
  18. ai = scanner.nextLong();
  19. q.add(new Attack(ai));
  20. if (x - ai <= 0 && !q.isEmpty()) {
  21. maxAttack = q.poll().attack;
  22. if (B > maxAttack) {
  23. x += B;
  24. } else {
  25. x += maxAttack;
  26. }
  27. y += A;
  28. }
  29. x -= ai;
  30. if (x <= 0) {
  31. break;
  32. }
  33. }
  34. if (y > 0) {
  35. System.out.println("Lose");
  36. } else {
  37. System.out.println("Win");
  38. System.out.println(i + 1);
  39. }
  40. }
  41. }
  42. class Attack implements Comparable<Attack> {
  43. public Long attack;
  44. public Attack(Long attack) {
  45. this.attack = attack;
  46. }
  47. @Override
  48. public int compareTo(Attack o) {
  49. return (int)(o.attack - this.attack);
  50. }
  51. }

  代码中我创建了一个实现了Comparable接口的Attack类来保存popo的伤害值,是因为我发现在oj平台上在优先队列的构造函数里使用匿名内部类会报错cannot infer type arguments for PriorityQueue<>
在这里插入图片描述
  如果有大佬知道这个报错是什么原因导致了,请在评论中指出,不胜感激

发表评论

表情:
评论列表 (有 0 条评论,103人围观)

还没有评论,来说两句吧...

相关阅读

    相关 51nod 1163 (贪心+优先队列

    有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的

    相关 51nod 1191(贪心+优先队列)

    有N只兔子,每只有一个血量B\[i\],需要用箭杀死免子。有M种不同类型的箭可以选择,每种箭对兔子的伤害值分别为D\[i\],价格为P\[i\](1 <= i <= M)。假设