• hdu 3008 Warcraft(DP)


    题意:

    小明和BOSS开始都有100的生命值。小明开始时拥有100魔法值。

    普通伤害为1。(不使用魔法技能)

    小明有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
    ",ans);
            }else{
                puts("My god");
            }
        }
    
        return 0;
    }
  • 相关阅读:
    最好用的html复制插件——Clipboard.js
    最好用的轮播插件——Swiper.js
    媒体查询
    函数防抖和节流
    JQ增删改查localStorage实现搜索历史功能
    vscode如何设置html模板
    js中innerHTML、outerHTML、innerText、outerText的区别
    JS实现一个简单的网页钟表
    Sql Server 2014完全卸载
    照片尺寸大小怎样换算?
  • 原文地址:https://www.cnblogs.com/fish7/p/4330118.html
Copyright © 2020-2023  润新知