贪心。数组都不用开那种。
考虑跑步距离的构成。发现跑步只有三种情况构成
- 休息
- 传送
- 朴素地跑
显然,如果可以传送,我们就不要朴素地跑步。因为\(17\le 60 \div 2 =30\)。
假如我们知道了传送的次数,花费的时间是确定的。
于是问题变成了,我们有多少魔法值去传送。
考虑魔法值的构成是
- 给定的\(M\)
- 休息的时间\(t \times 4\) , \(t \le T \le 300000\)
发现\(T \le300000\) 直接枚举 \(t\)。
把注释变成变量名了。就不给注释了。
#include<iostream>
using namespace std;
int T,S,M,ans=0x3f3f3f3f,maxd=0;
int main(){
cin>>M>>S>>T;
for(int t=0;t<=T;t++){
int ap=M+(t<<2);
int skip_times=ap/10;
//T-i : total_rest_time
int real_skip_times=min(skip_times,T-t);
int rest_time_left=T-t-real_skip_times;
int skip_dis=real_skip_times*60;
int run_dis=rest_time_left*17;
if(skip_dis>=S)
ans=min(ans,(S-1)/60+t+1);
if(run_dis+skip_dis>=S)
ans=min(ans,real_skip_times+t+(S-skip_dis-1)/17+1);
maxd=max(maxd,run_dis+skip_dis);
}
if(ans<=T)
cout<<"Yes\n"<<ans<<endl;
else
cout<<"No\n"<<maxd<<endl;
return 0;
}