题解 P1095 【守望者的逃离】
诶,看了四十余篇题解,似乎没有发现跟本蒟蒻思路一样的QAQ
思路如下:
①题目里给你多少魔,你就先用掉多少魔,如果在时间啊啊啊我弃疗了,输出No。
②闪完后,先记得把距离、时间、还有魔都扣掉,然后开一组死循环,按照剩余魔的数量进行模拟。
为啥要这么模拟?因为没人写这种思路因为这样处理起来会爽很多QAQ
魔的数量只可能是0~9,有了范围,下面就一起来愉快地判断吧!
魔为0~1,很显然,原地恢复5秒再闪2秒比跑7秒来的快;
魔为2~5,很显然,原地恢复2秒再闪1秒比跑3秒来的快;
魔为6~9,很显然,原地恢复1秒再闪1秒比跑2秒来的快;
让我们打出一个表,就是这样的:
魔剩余点数 剩余距离范围 剩余时间范围 闪后魔点数
0 >=120 >=7s 0
1 >=120 >=7s 1
2 >=52 >=3s 0
3 >=52 >=3s 1
4 >=52 >=3s 2
5 >=52 >=3s 3
6 >=35 >=2s 0
7 >=35 >=2s 1
8 >=35 >=2s 2
9 >=35 >=2s 3
让我们写出代码,就是这样的:
#include <bits/stdc++.h>//万能头文件
using namespace std;
int m,s,t;//定义
int main()
{
cin>>m>>s>>t;
int AK=t;
int ak=s;//emmm,个人喜好
if((m/10)*60>=s&&m/10>=t)//能不能直接用魔闪完
{
cout<<"Yes"<<endl;
if(s%60==0)
cout<<s/60<<endl;
else
cout<<s/60+1<<endl;
exit(0);
}
int p=(m/10)*60;//计算魔可以闪过的米数
if(t<m/10)//如果给定的时间不可以把魔全闪完
if(t*60<s)//如果连魔都闪不完
{
cout<<"No"<<endl;
cout<<t*60<<endl; //守望者弃疗了
exit(0);
}
else
{
if(s%60==0)
cout<<s/60<<endl;
else
cout<<s/60+1<<endl;
exit(0);
}
else
t-=(m/10);//把魔闪完减掉的时间
m%=10;
s-=p;//更新剩余距离
for(;;)//死循环
{
if(s<=0)
{
cout<<"Yes"<<endl;
cout<<AK-t<<endl;//如果已经跑完了,输出
exit(0);
}
if(t==0)//如果时间用完了还是跑不完
{
cout<<"No"<<endl;
cout<<ak-s<<endl;//守望者弃疗了
exit(0);
}
if(m<=1&&s>=120&&t>=7)//魔剩余点数0~1
{
s-=120;
t-=7;
continue;
}
if(m>=2&&m<=5&&s>=52&&t>=3)//魔剩余点数2~5
{
s-=60;
t-=3;
m+=8;
m%=10;
continue;
}
if(m>=6&&m<=9&&s>=35&&t>=2)//魔剩余点数6~9
{
s-=60;
t-=2;
m+=4;
m%=10;
continue;
}
while(1)//如果时间不够没法闪
{
s-=17;//守望者开始跑步
t--;
if(s<=0||t<=0)
break;
}
}
//码了1k,好累啊。。。
return 0;
}