Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 957 Accepted
Submission(s): 487
1 #include <iostream>
2 #include <stdio.h>
3 #include <string.h>
4 using namespace std;
5 int a[105],b[105];
6 int dp[105][105]; //代表到第 i 秒剩余 j 魔法值打掉BOSS的HP
7 int main()
8 {
9 int n,t,q;
10 while(cin>>n>>t>>q){
11 if(n==0 && t==0 && q==0)
12 break;
13 for(int i=1;i<=n;i++)
14 cin>>a[i]>>b[i];
15 //freopen("output.txt","w",stdout);
16 memset(dp,-1,sizeof(dp));
17 dp[0][100]=0; //刚开始的时候出了MP=100,其余都为无效
18 int T;
19 if(100%q==0)
20 T=100/q;
21 else
22 T=100/q+1;
23 int i,j,k;
24 for(i=1;i<=T;i++){ //最多到100秒
25 for(j=0;j<=100;j++){ //一次遍历dp[i-1][0..100]的所有情况
26 if(dp[i-1][j]==-1)
27 continue;
28 for(k=1;k<=n;k++){ //使用技能攻击
29 if(j-a[k]<0) //如果剩余的MP不足以使用这个技能,则跳出本次循环
30 continue;
31 int temp;
32 temp=j-a[k]+t>100?100:j-a[k]+t;
33 if(dp[i][temp]==-1){ //没到达过这个MP
34 dp[i][temp]=dp[i-1][j]+b[k];
35 if(dp[i][temp]>=100)
36 goto label;
37 }
38 else{ //说明之前有降到过这个MP,这个时候比较哪一个伤害高,记录伤害高的值
39 if(dp[i-1][j]+b[k] > dp[i][temp]){ //如果当前技能伤害高
40 dp[i][temp]=dp[i-1][j]+b[k];
41 if(dp[i][temp]>=100)
42 goto label;
43 }
44 }
45 }
46 if(j+t>=100){ //用普通攻击
47 if(dp[i-1][j]+1 > dp[i][100]) {
48 dp[i][100] = dp[i-1][j]+1;
49 if(dp[i][100]>=100)
50 goto label;
51 }
52 }
53 else{
54 if(dp[i-1][j]+1 > dp[i][j+t]){
55 dp[i][j+t]=dp[i-1][j]+1;
56 if(dp[i][j+t]>=100)
57 goto label;
58 }
59 }
60 }
61 }
62 label:
63 if(i>T) //正常退出,代表在规定时间内没打死BOSS,你挂了
64 cout<<"My god"<<endl;
65 else
66 cout<<i<<endl;
67 }
68 return 0;
69 }
Freecode : www.cnblogs.com/yym2013
原文:http://www.cnblogs.com/yym2013/p/3533914.html