Codeforces - 1334C 贪心

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值