题解 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; 
}