标签:
题意:
小明和BOSS开始都有100的生命值。小明开始时拥有100魔法值。
小明有N个魔法技能。每个技能消耗ai魔法值同时伤害BOSS bi生命值。
每一秒结束后小明如果还活着则会自动增加魔法值t。【增完魔法值不能超过100】
问小明最少需要多少秒把BOSS干掉。如果没办法干掉输出“MY GOD”。
BOSS每秒伤害小明Q点血。
思路:
小明被BOSS干掉的时间一开始就已知。所以只要判断在小明死之前能否把BOSS干掉即可。
第一秒小明选一个技能打,第二秒小明选一个技能打。第三秒......
DP结构出来。
dp[i][j]:第i秒结束后小明还剩j点魔法值时给BOSS选成的最大伤害是多少。
*: DP采用从当前推下一个的方式很好写。
代码:
struct node{ int magicCost; int lifeCost; } skill[105]; int n,q,t; int dp[105][105]; int main(){ while(scanf("%d%d%d",&n,&t,&q),n||q||t){ rep(i,1,n){ scanf("%d%d",&skill[i].magicCost,&skill[i].lifeCost); } mem(dp,-inf); dp[1][100]=1; rep(i,1,n){ dp[1][100-skill[i].magicCost+t]=skill[i].lifeCost; } int N=100/q+((100%q)!=0); rep(nowSecond,1,N-1){ rep(magicValue,0,100){ if(magicValue+t<=100){ dp[nowSecond+1][magicValue+t]=max( dp[nowSecond+1][magicValue+t],dp[nowSecond][magicValue]+1 ); }else{ dp[nowSecond+1][100]=max( dp[nowSecond+1][100],dp[nowSecond][magicValue]+1 ); } rep(i,1,n){ if(magicValue>=skill[i].magicCost){ dp[nowSecond+1][min(100,magicValue-skill[i].magicCost+t)] = max( dp[nowSecond+1][min(100,magicValue-skill[i].magicCost+t)],dp[nowSecond][magicValue]+skill[i].lifeCost ); } } } } int ans=-1; rep(second,1,N){ rep(magicValue,t,100){ if(dp[second][magicValue]>=100){ ans=second; break; } } if(ans!=-1) break; } if(ans!=-1){ printf("%d\n",ans); }else{ puts("My god"); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/fish7/p/4330118.html