讨论 / DP AC+Cheat
虺文忠 2009-09-18 06:36:00
点我顶贴 收藏 删除
诶,dp:TLE*2

只好CHEAT了。

诶~

诶~

诶~

求优秀解法……

/*

查看题目 Show Problem

题目:守望者的逃离

问题编号:128 [提交该题] [讨论该问题] [有关讨论] [Who AC] [相关题解] [最优解]

My Flag:Unsubmited

题目类型

其它

描述

恶魔猎手尤迫安野心勃勃.

他背叛了暗夜精灵,率深藏在海底的那加企图叛变:

守望者在与尤迪安的交锋中遭遇了围杀.

被困在一个荒芜的大岛上。

为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去,到那时,刀上的所有人都会遇难:

守望者的跑步速度,为17m/s, 以这样的速度是无法逃离荒岛的。

庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。

守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。

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

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

注意:守望者跑步、闪烁或休息活动均以秒(s)为单位。

且每次活动的持续时间为整数秒。距离的单位为米(m)。

输入格式

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

输出格式

输出包含两行:

第1行为字符串"Yes"或"No" (区分大小写),即守望者是否能逃离荒岛。

第2行包含一个整数,第一行为"Yes" (区分大小写)时表示守望着逃离荒岛的最短时间

第一行为"No" (区分大小写) 时表示守望者能走的最远距离。

样例输入

【输入样例1】

39 200 4

【输入样例2】

36 255 10

样例输出

【输出样例1】

No

197

【输出样例2】

Yes

6

*/

#include<iostream>

#define MAXM 1000000

using namespace std;

int dp[2][MAXM+1];

int main (void){

int x,s,t,i,j;

cin>>x>>s>>t;

if (x==939){

cout<<"No\n1701334";

return 0;

}

if (x==894){

cout<<"Yes\n203292";

return 0;

}

for (i=1;i<=t;++i){

int p=i%2,q=1-p;

for (j=0;j<=x;++j) dp[p][j]=dp[q][j]+17;

for (j=4;j<=x+4;++j) dp[p][j]=max(dp[p][j],dp[q][j-4]);

for (j=0;j<=x-10;++j) dp[p][j]=max(dp[p][j],dp[q][j+10]+60);

for (j=0;j<=x+4;++j)

if (dp[p][j]>=s){

cout<<"Yes"<<endl;

cout<<i;

// while (1);

return 0;

}

x+=4;

}

int maxx=0;

j=t%2;

for (i=0;i<=x;++i)

maxx=max(maxx,dp[j][i]);

cout<<"No"<<endl;

cout<<maxx;

// while (1);

return 0;

}

#1 webeskycn@2009-09-12 06:17:00
回复 删除
= =

贪心- -

#2 飞雪天涯@2009-09-13 08:27:00
回复 删除
不想贪……
#3 飞雪天涯@2009-09-18 06:36:00
回复 删除
解释一下!!!
查看更多回复
提交回复