您的位置:首页 > 其它

hdu-3008魔兽争霸

2015-08-06 21:27 351 查看
这道题目相当有意思,打魔兽对于很多人来说并不陌生,人和boss的hp都是100,人首先攻击,人的普攻为1,有木有这么弱!还好技能是自己输入,不然真的没话说。

好啦,这题就是用动态规划解题,主要还是看状态方程,状态方程不唯一,你可以设f[i][j]表示第i次攻击是剩余蓝量j所造成的最大伤害,也可设第i次攻击所造成的伤害j所消耗的蓝量,反正这道题状态方程不唯一,这是我用第一种状态方程写的,变量有点多,但是找到关键,其实都是浮云。状态方程:f[i][j-a[k]+t]=max(f[i][j-a[k]+t],f[i-1][j]+b[k]);

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int f[101][101];
int main()
{
int n,t,q;
int a[101],b[101];
int time;
while(cin>>n>>t>>q&&(n+t+q))
{

memset(f,-1,sizeof(f));//初始化为-1
for(int i=1; i<=n; i++)
{
cin>>a[i]>>b[i];
}
f[0][100]=0;
a[0]=0;
b[0]=1;
time=100/q;//表示人最多经过几回合
if(100%q!=0)
time++;
int ans=-1;
for(int i=1; i<=time; i++)
{
for(int j=0; j<=100; j++)//表示剩余蓝量

if(f[i-1][j]!=-1)
{
for(int k=0; k<=n; k++)//使用技能
{
if(j>=a[k])//当前蓝量可支持a[k]技能的释放,进入循环
{
f[i][j-a[k]+t]=max( f[i][j-a[k]+t],f[i-1][j]+b[k]);//状态方程
if( f[i][j-a[k]+t]>=100)//所造成伤害超过100,记录是第几回合
{
ans=i;
break;
}

}
if(ans!=-1)
break;
}

}
if(ans!=-1)
break;
}
if(ans==-1)
cout<<"My god"<<endl;
else
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: