[NOIP2007Junior] 守望者逃离

题目描述

恶魔猎手尤迪安野心勃勃,她背叛了暗夜精灵,率领深藏在海底的 [哔——] 族企图叛变。

守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。

守望者的跑步速度为 17m/s

,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在 1s 内移动 60m,不过每次使用闪烁法术都会消耗魔法值 10pts。守望者的魔法值恢复的速度为 4pts/s

,只有处在原地休息状态时才能恢复。 

现在一直守望者的魔法初值 M,他所在的初始位置与岛的出口之间的距离 S,岛沉没的时间 T

你的任务是写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望者在剩下的时间内能走的最远距离。

注意:守望者跑步、闪烁或休息活动均以秒为单位,且每次活动的持续时间为正数秒。距离单位为米。

输入

仅一行,包括空格隔开的三个非负整数 M,S,T

输出

包含两行:        

第一行为字符串 YesNo(区分大小写),即守望者是否能逃离荒岛。        

第二行包含一个整数。第一行为 Yes(区分大小写)时表示守望者逃离荒岛的最短时间;第一行为 No(区分大小写)时表示守望者能走的最远距离。

样例输入

39 200 4

样例输出

No
197

提示

30%

的数据满足: 1T10,1S100

50%

的数据满足: 1T103,1S104

100%

的数据满足:1T3×105,0M103,1S108

耗时0s的题解:

#include<iostream>
using namespace std;
int m,t,d,T,D;
int main()
{
    cin>>m>>d>>t;
    T=t;
    while(m>=10&&t>0&&d>D)
    {
        if (d-D>17)
            D+=60,t--,m-=10;
        else cout<<"Yes"<<endl<<T-t+1;
    }
    while(t>0&&d-D>0)
    {
        if((m==0||m==1)&&t>=7&&d-D>102)
         {
            t-=7;
            D+=120;
         }
         else if((m>=2&&m<=5)&&t>=3&&d-D>34)
               {
                m-=2;t-=3;D+=60;
               }
               else if(m>=6&&t>=2&&d-D>17)
                    {
                        m-=6;t-=2;D+=60;
                    }
                     else {
                        D+=17;t--;
                     }
    }
    if(d<=D) cout<<"Yes"<<endl<<T-t;
      else cout<<"No"<<endl<<D;
    return 0;
}

耗时3s的贪心+模拟题解:

#include<iostream>
#include<cstdio>
using namespace std;
#define  MAXN 300010
int main()
{
    int m,s,t,i;
    int f[MAXN];
    cin>>m>>s>>t;
    f[0]=0;
    for(int i=1;i<=t;i++)
    {
        if(m>9)
        {
            f[i]=f[i-1]+60;
            m=m-10;
        }
        else
        {
            f[i]=f[i-1];
            m+=4;
        }
    }
    for(int i=1;i<=t;i++)
    {
        if(f[i]<f[i-1]+17) f[i]=f[i-1]+17;
        if(f[i]>=s)
        {
            cout<<"Yes"<<endl<<i;
            return 0;
        }
    }
    cout<<"No"<<endl<<f[t];
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zjy_code/article/details/80688172