P1095 守望者的逃离(dp)

题目大意,每一秒有三种选择,闪现,每次移动60m,消耗10点蓝。

跑步,每次移动17m,不耗蓝。 原地休息,回复4点蓝。

给初始蓝值,目标距离,和时间。问能达的最短时间和不能到达的最远距离。

题解:我们尽量都取闪现的方式,不够量就原地恢复,算出所能到达的最远距离。

再在每一秒比较此距离与上一秒选择跑步的距离,从中取最大值。能达到就输出。时间到了还没到达目的地,就输出最大距离。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int dp[300005];
int main(){
    int m,s,t;
    cin>>m>>s>>t;
    fill(dp,dp+300005,0);
    for(int i=1;i<=t;i++){///先算出全部采用闪现的最远距离
        if(m>=10){
            dp[i]=dp[i-1]+60;///距离等于上一秒加60
            m-=10;
        }
        else{
            dp[i]=dp[i-1];///距离等于上一秒的距离
            m+=4;
        }
    }
    for(int i=1;i<=t;i++){
        dp[i]=max(dp[i],dp[i-1]+17);///综合比较一下
        if(dp[i]>=s){
            cout<<"Yes"<<endl;
            cout<<i<<endl;
            return 0;
        }
    }
    cout<<"No"<<endl;
    cout<<dp[t]<<endl;
    return 0;
}
View Code

 

原文地址:https://www.cnblogs.com/mohari/p/12952979.html