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; }