1 条题解
-
0
自动搬运
来自洛谷,原作者为

wpy233
你弱归你弱,py比你弱。 stO 所有关注我的巨佬 Orz搬运于
2025-08-24 21:20:52,当前版本为作者最后更新于2019-08-18 21:32:26,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
诶,看了四十余篇题解,似乎没有发现跟本蒟蒻思路一样的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; }
- 1
信息
- ID
- 97
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者