Tyvj P 1108(見張り人の逃走-欲張り)

1881 ワード

P 108見張り人の脱出
時間:1000 ms/空間:131072 KiB/Javaクラス名:Main
背景
NOIP 2007
説明
悪魔ハンターのユディアンは野心的で、彼女は暗夜の精霊を裏切って、海底に深く隠れている「ピー--」族を率いて反乱を企んだ.見張りはユディアンとの戦いで包囲殺され、荒れ果てた島に閉じ込められた.見張り人を殺すために、ユディアンはこの荒島に呪いをかけ始め、この島はすぐに沈む.その時になると、島のすべての人が遭難します.見張り人のランニングスピードは17 m/sで、このようなスピードでは島から逃げられない.幸いなことに、守望者は点滅法術を持ち、1 s以内に60 m移動できるが、点滅法術を使うたびに魔法値10点を消費する.守望者の魔法値回復速度は4時/sで、その場で休憩している場合にのみ回復します. 
今まで见守ってきた魔法の初期値M、彼がいた初期位置と岛の出口の间の距离S、岛が沈没した时间T.あなたの任務は、見張り人が最短時間で島を脱出する方法を計算し、脱出できない場合は、見張り人が残りの時間で歩ける最も遠い距離を出力するプログラムを書くことです.注意:見張り人はランニング、点滅または休憩活動はいずれも秒(s)単位であり、各活動の持続時間は正数秒である.距離の単位はメートル(m)です.
入力フォーマット
ファイルを入力します.inスペースで区切られた3つの非負の整数M,S,Tを含む1行のみ.
出力フォーマット
出力ファイルescape.outには2行あります.
1行目の文字列「Yes」または「No」(大文字と小文字を区別)は、見張り人が島から脱出できるかどうかです.
2行目には整数が含まれます.第一行為「Yes」(大文字と小文字を区別)は、見張り人が島から脱出する最短時間を表し、第一行為「No」(大文字と小文字を区別)は、見張り人が歩ける最遠距離を表す.
試験例1
入力
39 200 4
しゅつりょく
No 
197
コメント
From KM Zhangze
提出評価問題解決の表示
本題提出記録の表示私の記録
11-20 Accepted
11-19 Wrong Answer
欲張る
「ずっと魔に戻って点滅し、最後に狂奔する」という戦略を取ることができ、悪くない.
回魔のきらめく最遠距離を記録するs[i]ついでにランニングで最も遠くまで走れるmax_を記録するs[i]=(max_s[i-1]+17,s[i])
そして隣接変数が2つしかないので配列も省けます.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<ctype.h>
#include<string.h>
#define MAXM (1000+10)
#define MAXS (108+10)
#define MAXT (300000+10)

int M,S,T;
int main()
{
	
	while(scanf("%d%d%d",&M,&S,&T)!=EOF)
	{
		int m=M,s=0,max_s=0,t=0,i,j,k;
		
		while(1)
		{
			if (max_s>=S) 
			{
				printf("Yes
%d
",t); break; } if (t==T) { printf("No
%d
",max_s); break; } if (m>=10) { m-=10; s+=60; } else { m+=4; } max_s=max_s+17>s?max_s+17:s; t++; } } return 0; }