度度熊与邪恶大魔王
?
鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6082
Problem Description 度度熊為了拯救可愛的公主,于是與邪惡大魔王戰斗起來。邪惡大魔王的麾下有n個怪獸,每個怪獸有a[i]的生命值,以及b[i]的防御力。度度熊一共擁有m種攻擊方式,第i種攻擊方式,需要消耗k[i]的晶石,造成p[i]點傷害。當然,如果度度熊使用第i個技能打在第j個怪獸上面的話,會使得第j個怪獸的生命值減少p[i]-b[j],當然如果傷害小于防御,那么攻擊就不會奏效。如果怪獸的生命值降為0或以下,那么怪獸就會被消滅。當然每個技能都可以使用無限次。請問度度熊最少攜帶多少晶石,就可以消滅所有的怪獸。Input 本題包含若干組測試數據。第一行兩個整數n,m,表示有n個怪獸,m種技能。接下來n行,每行兩個整數,a[i],b[i],分別表示怪獸的生命值和防御力。再接下來m行,每行兩個整數k[i]和p[i],分別表示技能的消耗晶石數目和技能的傷害值。數據范圍:1<=n<=1000001<=m<=10001<=a[i]<=10000<=b[i]<=100<=k[i]<=1000000<=p[i]<=1000Output 對于每組測試數據,輸出最小的晶石消耗數量,如果不能擊敗所有的怪獸,輸出-1Sample Input 1 2 3 5 7 10 6 8 1 2 3 5 10 7 8 6Sample Output 6 18Source 2017"百度之星"程序設計大賽 - 資格賽 題干?
#include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; const LL INF=1e18+7; LL n,m,f[155][5507]; LL maxp,max1,max2,ans,mn; LL a[100007],b[100007],v[100007],p[100007]; void first(){for(int i=0;i<=max2;i++)for(int j=1;j<=max1+maxp;j++)f[i][j]=INF;for(int k=0;k<=max2;k++)for(int i=1;i<=m;i++){LL now=p[i]-(LL)k;if(now<=0) continue;for(int j=1;j<=maxp+max1;j++){if(j-now>=0) f[k][j]=min(f[k][j],f[k][j-now]+v[i]);else f[k][j]=min(f[k][j],v[i]);}} } int main() {while(scanf("%lld %lld",&n,&m)!=EOF){maxp=max1=max2=ans=mn=0;for(int i=1;i<=n;i++){scanf("%lld%lld",&a[i],&b[i]),max1=max(a[i],max1),max2=max(max2,b[i]);}for(int i=1;i<=m;i++){scanf("%lld%lld",&v[i],&p[i]);maxp=max(maxp,p[i]);}if(max2>=maxp){printf("-1\n");continue;}first();for(int i=1;i<=n;i++) ans+=f[b[i]][a[i]];printf("%lld\n",ans);}return 0; } 代碼?
數據怎么大,有像背包(有遞推性質),那就dp吧。
f[i][j]表示要殺掉防御為i,生命為j的怪獸需要的水晶。
dp時要注意:如果不能破防,就不要用該技能啦。
轉載于:https://www.cnblogs.com/CLGYPYJ/p/7390466.html
總結
- 上一篇: 运动控制卡的基类函数与实现例子
- 下一篇: 写一个线程安全的单例模式