【故事背景】
長期的宅男生活中,jyy又挖掘出了一款rpg遊戲。在這個遊戲中jyy會
扮演乙個英勇的騎士,用他手中的長劍去殺死入侵村莊的怪獸。
【問題描述】
在這個遊戲中,jyy一共有兩種攻擊方式,一種是普通攻擊,一種是法術攻
擊。兩種攻擊方式都會消耗jyy一些體力。採用普通攻擊進攻怪獸並不能把怪獸徹底殺死,怪獸的屍體可以變出其他一些新的怪獸,注意乙個怪獸可能經過若干次普通攻擊後變回乙個或更多同樣的怪獸;而採用法術攻擊則可以徹底將乙個怪獸殺死。當然了,一般來說,相比普通攻擊,法術攻擊會消耗更多的體力值(但由於遊戲系統bug,並不保證這一點)。
遊戲世界中一共有n種不同的怪獸,分別由1到n編號,現在1號怪獸入
侵村莊了,jyy想知道,最少花費多少體力值才能將所有村莊中的怪獸全部殺死呢?
第一行包含乙個整數n。
接下來n行,每行描述乙個怪獸的資訊;
其中第i行包含若干個整數,前三個整數為si,ki和ri,表示對於i號怪獸,
普通攻擊需要消耗si的體力,法術攻擊需要消耗ki的體力,同時i號怪獸死亡後會產生ri個新的怪獸。表示乙個新出現的怪獸編號。同一編號的怪獸可以出現多個。
輸出一行乙個整數,表示最少需要的體力值。
44 27 3 2 3 2
3 5 1 2
1 13 2 4 2
5 6 1 2
26【樣例說明】
首先用消耗4點體力用普通攻擊,然後出現的怪獸編號是2,2和3。花費
10點體力用法術攻擊殺死兩個編號為2的怪獸。剩下3號怪獸花費1點體力進
行普通攻擊。此時村莊裡的怪獸編號是2和4。最後花費11點體力用法術攻擊
將這兩隻怪獸徹底殺死。一共花費的體力是4+5+5+1+5+6=26。
【資料範圍】
2<=n<=2*10^5,1<=ri,sigma(ri)<=10^6,1<=ki,si<=5*10^14
【jsoi2014第二輪 d1t3】
那時候做這題直接用貪心拿了30分。完全沒想到正解那麼巧妙的方法
令dk表示破壞第k個節點所需要的體力值
我們可以發現,當且僅當si+
sigma dj
這個式子很像spfa更新時候的式子。那麼我們可以一開始把所有的點都加進佇列裡,然後如果這個點可以被後繼更新,那麼酒吧這個點的所有前驅都加入佇列即可。
【不明真相地切了個rank1,大概也保持不了多久】
#include#includeusing namespace std;
struct line
a[1000001],exa[1000001];
int head[200001],exhead[200001];
int edge,exedge;
inline void add(int s,int t)
inline void exadd(int s,int t)
long long s[200001],k[200001];
bool v[200001];
long long dis[200001];
long long adis[200001];
queue q;
inline void spfa()
adis[t]=adis[t]-dis[d]+adis[d]+s[d];
}dis[d]=adis[d]+s[d];}}
}int main()
}for(i=1;i<=n;i++)
for(i=1;i<=n;i++)
for(j=head[i];j!=0;j=a[j].next)
adis[i]+=dis[a[j].t];
spfa();
printf("%lld\n",dis[1]);
return 0;
}
bzoj3875 Ahoi2014 騎士遊戲
易水人去,明月如霜。故事背景 長期的宅男生活中,jyy又挖掘出了一款rpg遊戲。在這個遊戲中jyy會 扮演乙個英勇的騎士,用他手中的長劍去殺死入侵村莊的怪獸。問題描述 在這個遊戲中,jyy一共有兩種攻擊方式,一種是普通攻擊,一種是法術攻 擊。兩種攻擊方式都會消耗jyy一些體力。採用普通攻擊進攻怪獸並...
3875 Ahoi2014 騎士遊戲
題目鏈結 題目大意 給定n個怪物,每個怪物可以用魔法直接乾掉,或者用物理攻擊使其 為一些其他怪物,求殺掉1號怪物的最小花銷題解 f i 表示殺 死i號怪 物的最小 花銷,則 f i min k i s i f j 其中j 為i用物 理攻擊後 可以 為的怪物 但是直接dp有後效性,因此我們用spfa來...
bzoj3875 騎士遊戲 最短路
以前看到過類似的最短路,就是已知乙個集合 稱為s 在這個集合全部得到後經過t的時間可以得到另乙個集合 稱為t 求從乙個物品得到另外乙個物品的最短時間。不妨先看一下這個類似的問題 在這個問題中,用bellman ford,看s能否更新t中的某乙個,直到不能更新就終止。那麼同樣在這個問題中,首先定義d ...