题解 P1095 【守望者的逃离】

· · 题解

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

思路如下:

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