hdu 3008 动态规划

题意:人有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 )

 

 

const int M = 105;
int dp[M][M];
int n, t, q;
int a[M], b[M];
int ans;

int main(){
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    #endif

    while(scanf("%d%d%d", &n, &t, &q), n|t|q){
        b[0] = 1;
        FOE(i, 1, n) scanf("%d%d", &a[i], &b[i]);

        memset(dp, -1, sizeof dp);
        dp[0][100] = 100;

        int T = 100/q + (100%q?1:0);
        ans = -1;

        FOR(i, 0, T) FOE(j, 0, 100) {
            if(dp[i][j] > 0){
                FOE(k, 0, n){
                    if(j >= a[k]) {
                        int jj = j - a[k] + t;
                        if(jj > 100) jj = 100;

                        if(dp[i+1][jj] == -1 || dp[i+1][jj] > dp[i][j] - b[k]){
                            dp[i+1][jj] = dp[i][j] - b[k];

                            if(dp[i+1][jj] <= 0) {
                                ans = i+1;
                                k = n+1; j = 105; i = 105;
                            }
                        }
                    }
                }
            }
        }

        if(ans == -1) printf("My god\n");
        else printf("%d\n", ans);
    }

    return 0;
}

 

posted @ 2013-07-06 14:05  心向往之  阅读(291)  评论(0编辑  收藏  举报