题意:人有100血和100魔法,每秒增加 t 魔法(不能超过100)。n个技能,每个技能消耗a[i]魔法值,造成b[i]伤害。普通攻击不消耗魔法,每秒1伤害。
boss有100血,每秒对人造成q伤害。每秒内,人先攻击,boss后攻击。问最少多少秒杀死boss?
分析:boss对人每秒q伤害,人的死亡时间是确定的,T = 100/q + ( 100%q?1:0 )。
普通攻击可看作a=0 b=1的技能。
dp(i, j)表示第i秒,魔法值j,boss的最少血量。 dp(i, jj) = min dp(i-1, j) - b[k] jj = min( j-a[k]+t, 100 )
#include<bits/stdc++.h>
using namespace std;
struct node
{
int mp,hp;
}a[1000];
int dp[2100][1000];
int main()
{
int n,t,m;
while(~scanf("%d%d%d",&n,&t,&m))
{
if(!n&&!m&&!t)break;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].mp,&a[i].hp);
}
a[n+1].hp=1,a[n+1].mp=0;
int time=100%m?100/m+1:100/m;
int flag=0;
for(int i=1;i<=time;i++)
{
for(int j=1;j<=n+1;j++)
{
for(int k=100;k>=a[j].mp;k--) ///二维背包
{
dp[i][k]=max(dp[i][k],dp[i-1][k-a[j].mp+t]+a[j].hp);
if(dp[i][k]>=100)
{
flag=i;break;
}
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
printf("%d\n",flag);
else
printf("My god\n");
}
return 0;
}