可以把所有跑步操作都放在最后一段连续的时间内,因此最优解一定可以拥有以下结构:

遍历时间从1到T,在这个过程中,用s1表示守望者当前能达到的最远距离,用s2表示只用法术能达到的最远距离,每秒给s1增加17,s2则是有足够能量就用法术,没有就增加能量,如果某一时刻 i 出现了s2>s1,令s1=s2,表示1到 i 时刻守望者只用法术。
#include<bits/stdc++.h>
using namespace std;
using ll=long long ;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);
ll M,S,T;
cin>>M>>S>>T;
ll energy=M;
ll s1=0,s2=0;
ll ans=-1;
for(ll i=1;i<=T;i++){
s1+=17;
if(energy>=10){
s2+=60;
energy-=10;
}else {
energy+=4;
}
if(s2>s1) s1=s2;
if(s1>=S) {
ans=i;break;
}
}
if(ans==-1) {
cout<<"No"<<"\n";
cout<<s1<<"\n";
}else {
cout<<"Yes"<<"\n";
cout<<ans<<"\n";
}
return 0;
}
108

被折叠的 条评论
为什么被折叠?



