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