题解 P1095 【守望者的逃离】
我WA了3次才AC
我们不妨将整个过程分成4部分 :
1、只用闪烁不回复的跑法
很显然这种跑法对答案的贡献(跑的距离)为 M/10*6
花费的时间为M/10
2、用光剩下的魔法的跑法
其实没有必要用光魔法,当魔法<1的时候就对答案没有任何贡献了(大家想想就明白了)
那么不妨while (暴力) 一下
3、边回复魔法边跑的跑法
当魔法<1时
回复5s+闪烁2s的跑法对答案贡献为120 ;
跑7s对答案的贡献为119 (什么鬼才出题);
很明显边回复魔法边跑的跑法优于直接跑的跑法
这种跑法可以持续到 剩下距离<120 的时候
4、直接跑的跑法
很简单,剩下距离%120/17+特判就ok了
那么怎么解决守望者在限制内跑不出岛的情况呢?
A:在每种情况内特判+return 就ok了
具体怎么特判 我懒得写 有点复杂,自己看程序吧
下面奉上蒟蒻的丑代码
#include<iostream>
#include<stdio.h>
using namespace std;
int m,s,t,need,ans,dis,temp;
int main()
{
cin>>m>>s>>t;
//跑法1:
if (m/10*60>=s)
{
if (m/10<=t) cout<<"Yes"<<endl<<s/60+(s%60!=0?1:0)<<endl; else
cout<<"No"<<endl<<60*t;
return 0;
}
if (m/10>t) {cout<<"No"<<endl<<t*60; return 0;}
dis=m/10*60; ans+=m/10;
m%=10;
//跑法2:
while (true)
{
if (m<2) break;
ans++;
temp++;
if (ans>t) {cout<<"No"<<endl<<dis+(temp-1)*17<<endl; return 0;}
if (m>=10) {dis+=60; m%=10; temp=0;}
else m+=4;
if (dis>=s) {cout<<"Yes"<<endl<<ans<<endl; return 0;}
}
//跑法3:
if (ans+((s-dis)/120*7)>t)
{
cout<<"No"<<endl<<dis+(t-ans)/7*120+(t-ans)%7*17; return 0;
}
ans+=((s-dis)/120)*7;
dis+=(s-dis)/120*120;
if (ans+((s-dis)/17+((s-dis)%17>0?1:0))>t)
{
cout<<"No"<<endl<<dis+(t-ans)*17; return 0;
}
//跑法4:
ans+=(s-dis)/17+((s-dis)%17>0?1:0);
cout<<"Yes"<<endl<<ans<<endl;
}