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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章