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