1 条题解

  • 0
    @ 2025-8-24 21:20:53

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar wpy233
    你弱归你弱,py比你弱。 stO 所有关注我的巨佬 Orz

    搬运于2025-08-24 21:20:52,当前版本为作者最后更新于2019-08-18 21:32:26,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    诶,看了四十余篇题解,似乎没有发现跟本蒟蒻思路一样的QAQ

    思路如下:

    ①题目里给你多少魔,你就先用掉多少魔,如果在时间tt内都闪不出去,守望者:啊啊啊我弃疗了,输出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
    上传者