<Codeforces - 1334C> 贪心

http://codeforces.com/contest/1334/problem/C

题意:

一共cas个查询,对于每个查询,顺时针排列n个怪物,每个怪物有两个属性,属性a表示生命值,属性b表示当前怪物死时自爆对下一个怪物产生的伤害,生命值<=0时视为死亡,你可以对怪物射击,每次射击伤害都是1,问最少开几枪,可以杀死所有怪物。

思路:

首先,每种怪物的死法,大体可以分成两种:

第一种就是这个怪物作为你射击的起点,也就是说它完全是被你打死的,对它的伤害没有来自它上一个怪物的自爆;

第二种就是对它的伤害有一部分来自它上一个怪物的自爆,如果它上一个自爆没能炸死它那还需要你补刀。

那我们只需要O(n)枚举起点就可以了,谁做起点谁自杀,然后顺时针这一圈除了起点位置,所有怪物都受到了上一个自爆产生的伤害。对于每个怪物来说,如果他的死法是第二种,那么这个伤害值是恒定的,即:

num[i] = max(0LL, p[i].a - p[id].b); //记num为怪物在第二种死法的条件下,我还需要打它几枪

然后我们记一下所有num的总和sum,sum就是这一圈怪物如果都是第二种死法,我一共需要打他们几枪。

接下来就枚举起点,因为起点是第一种死法,所以每次用sum减去起点如果是第二种死法产生的花费,

即:res -= num[i];

然后再加上起点被你打死需要的花费,也就是他的生命值,

即:res += p[i].a;

维护一个最小值即可。

AC代码:

Codeforces - 1334C 贪心

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-11
  • 2021-08-15
  • 2021-07-28
  • 2022-12-23
  • 2021-08-13
猜你喜欢
  • 2021-05-29
  • 2022-01-21
  • 2022-01-12
  • 2022-02-25
  • 2021-11-06
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案