题目大意,每一秒有三种选择,闪现,每次移动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; }