【NOIP2007】守望者的逃离
原题:
这个马维一看就不会玩,闪现肯定直接抄近道,谁会老老实实按路线闪
一眼看上去一道数学题,但是仔细观察可以发现可用的时间不多,只有3e5
因此可以大力发扬暴力精神,直接枚举闪多少次或者聚多少秒
如果枚举闪多少次,则还需要计算攒够闪这么多次的时间,比较繁琐
枚举聚多少秒相对简单,但是需要注意,一开始的魔量可能很大以至于把时间闪完都用不完,需要特判
代码:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int n,m,o; 5 int main(){ 6 cin>>n>>m>>o; 7 int ans1=0,ans2=1000000007; 8 for(int i=0;i+(n+i*4)/10<=o;++i){ 9 ans1=max(ans1,(n+i*4)/10*60+(o-i-(n+i*4)/10)*17); 10 ans2=min(ans2,(((n+i*4)/10*60<=m ? m-(n+i*4)/10*60 : 0)+16)/17+i+(n+i*4)/10); 11 } 12 if(n/10>o){ 13 ans1=max(ans1,o*60); 14 ans2=min(ans2,(m+59)/60); 15 } 16 if(ans2<=o) printf("Yes\n%d\n",ans2); 17 else printf("No\n%d\n",ans1); 18 return 0; 19 }