<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代码: