洛谷1095 守望者的逃離

洛谷1095 守望者的逃離 本題地址: http://www.luogu.org/problem/show?pid=1095

題目描述
  惡魔獵手尤迪安野心勃勃,他背叛了暗夜精靈,率領深藏在海底的娜迦族企圖叛變。守望者在與尤迪安的交鋒中遭遇了圍殺,被困在一個荒蕪的大島上。爲了殺死守望者,尤迪安開始對這個荒島施咒,這座島很快就會沉下去。到那時,島上的所有人都會遇難。守望者的跑步速度爲17m/s,以這樣的速度是無法逃離荒島的。慶幸的是守望者擁有閃爍法術,可在1s內移動60m,不過每次使用閃爍法術都會消耗魔法值10點。守望者的魔法值恢復的速度爲4點/s,只有處在原地休息狀態時才能恢復。
  現在已知守望者的魔法初值M,他所在的初始位置與島的出口之間的距離S,島沉沒的時間T。你的任務是寫一個程序幫助守望者計算如何在最短的時間內逃離荒島,若不能逃出,則輸出守望者在剩下的時間內能走的最遠距離。注意:守望者跑步、閃爍或休息活動均以秒(s)爲單位,且每次活動的持續時間爲整數秒。距離的單位爲米(m)。
輸入輸出格式
輸入格式:
輸入文件escape.in僅一行,包括空格隔開的三個非負整數M, S, T。

輸出格式:
輸出文件escape.out包含兩行:
第1行爲字符串“Yes”或“No”(區分大小寫),即守望者是否能逃離荒島。
第2行包含一個整數。第一行爲“Yes”(區分大小寫)時表示守望者逃離荒島的最短時間;第一行爲“No”(區分大小寫)時表示守望者能走的最遠距離。

輸入輸出樣例
輸入樣例#1:
【輸入樣例1】
39 200 4
【輸入樣例2】
36 255 10
輸出樣例#1:
【輸出樣例1】
No
197
【輸出樣例2】
Yes
6
說明  
30%的數據滿足:1 <= T <= 10, 1 <= S <= 100
50%的數據滿足:1 <= T <= 1000, 1 <= S <= 10000  
100%的數據滿足:1 <= T <=300000, 0 <= M <= 1000, 1 <= S <= 108 .

純貪心題,可以模擬每一秒的狀態。換一種思路:假設有守望者會分裂!分裂出來的那個只會用魔法(用不了就休息),正版守望者只會跑步,如果盜版超過了正版,就把正版的路程賦值爲盜版的路程(貪心基本原則:能用就用,用不了就跑或休息),詳細見程序註釋。

#include<cstdio>
using namespace std;
int m,s,t,r1,r2,t1;
int main()
{
    scanf("%d%d%d",&m,&s,&t);
    while (r1<s)
    {
        ++t1;//時間
        if (t1>t)//沒時間了!!
        {
            printf("No\n%d",r1);
            return 0;
        }
        if (m>=10)//能用就用
        {
            m-=10;
            r2+=60;//盜版的路程
        }
        else m+=4;//原地休息
        r1+=17;//正版跑步
        if (r2>r1) r1=r2;
    }
    printf("Yes\n%d",t1);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章