题意:给出自身能量值,给出逃离所需距离,给出逃离限制时间

     给出条件:每秒17米或者消耗10点能量闪现60米

        也可以选择原地不动回复4点能量值

          问:假如能逃离,输出yes和最短逃离时间

            假如不能逃离,输出最长逃离距离;

思路:很明显,再距离逃离点还很远的时候,我们一直用闪现就行;

      因为即使算上能量消耗存储所耗时间,也比每秒17米快

        所以我们不妨先dp闪现部分

          再dp跑步部分(其实只有在最后快到达终点的时候才需要跑步)即可

P1095 守望者的逃离_c++P1095 守望者的逃离_DP_02
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=3e5+10;
 4 int dp[maxn];
 5 int main(){
 6     int m,s,t;
 7     scanf("%d%d%d",&m,&s,&t);
 8     for(int i=1;i<=t;i++){
 9         if(m>=10)dp[i]=dp[i-1]+60,m-=10;
10         else dp[i]=dp[i-1],m+=4;
11     }
12     for(int i=1;i<=t;i++){
13         dp[i]=max(dp[i],dp[i-1]+17);
14         if(dp[i]>=s){
15             printf("Yes\n%d",i);
16             return 0;
17         }
18     }
19     printf("No\n%d",dp[t]);
20     return 0;
21 }
View Code