1. 程式人生 > >C/C++ 演算法分析與設計:貪心(守望者的逃離)

C/C++ 演算法分析與設計:貪心(守望者的逃離)

題目描述

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

輸入

多組測試資料,每組僅一行,包括空格隔開的三個非負整數M,S,T。

輸出

每組輸出: 
第1行為字串"Yes"或"No" (區分大小寫),即守望者是否能逃離荒島。
第2行包含一個整數,第一行為"Yes" (區分大小寫)時表示守望著逃離荒島的最短時間
第一行為"No" (區分大小寫) 時表示守望者能走的最遠距離。

樣例輸入

39 200 4

樣例輸出

No
197
#include<iostream>
using namespace std;
int main()
{
	int m,s,t,x=0,y=0,t1,f;
	scanf("%d%d%d",&m,&s,&t);
	t1=t;
	while(t1>0)
	{
		t1--;
		if(m>=10)
		{m-=10;x+=60;}
		if(m<10)
		{f=0;break;}
		if(x>=s)
		{printf("Yes\n");printf("%d\n",t-t1);break;}
	
	}
	if(f==0)
	{
		y=x;
		while(t1>0)
		{
			t1--;
	        m+=4;
		    if(m>=10)
			{m-=10;}
			if(t1>0)
			{t1--;x+=60;y=x;}
		    else
			{y+=17;}
		    if(y>=s || x>=s)
			{printf("Yes\n");printf("%d %d %d\n",t-t1,t,t1);break;}
		}
		if(t1==0)
		{printf("No\n");printf("%d\n",y>x?y:x);}
	}
	return 0;
}