hdu-3008魔兽争霸

这道题目相当有意思,打魔兽对于很多人来说并不陌生,人和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;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值