1048 [NOIP2007]守望者的逃离 线性DP 贪心 无后效性
链接:https://ac.nowcoder.com/acm/contest/24213/1048
来源:牛客网
题目描述
现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。你的任务是写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望者在剩下的时间内能走的最远距离。注意:守望者跑步、闪烁或休息活动均以秒(s)为单位,且每次活动的持续时间为整数秒。距离的单位为米(m)。
输入描述:
包括空格隔开的三个非负整数M,S,T。
输出描述:
第1行为字符串“Yes”或“No”(区分大小写),即守望者是否能逃离荒岛。
第2行包含一个整数。第一行为“Yes”(区分大小写)时表示守望者逃离荒岛的最短时间;第一行为“No”(区分大小写)时表示守望者能走的最远距离。
备注:
30%的数据满足:1 ≤ T ≤ 10, 1 ≤ S ≤ 1008
50%的数据满足:1 ≤ T ≤ 1000, 1 ≤ S ≤ 10000
100%的数据满足:1 ≤ T ≤ 300000, 0 ≤ M ≤ 1000, 1 ≤ S ≤ 10
.
分析:
//-------------------------代码----------------------------
#define int ll
const int N = 1e6+10;
int n,m,s,t;
int dp[N];
void solve()
{
cin>>m>>s>>t;
fo(i,1,t) {
if(m >= 10) {
dp[i] = dp[i-1] + 60;
m -= 10;
} else {
dp[i] = dp[i-1];
m += 4;
}
}
fo(i,1,t) {
dp[i] = max(dp[i],dp[i-1] + 17);
}
bool f = 0;
fo(i,1,t) {
if(dp[i] >= s) {
cout<<"Yes"<<endl<<i<<endl;
f = 1;
break;
}
}
if(!f) {
cout<<"No"<<endl;
cout<<dp[t]<<endl;
}
}
signed main(){
clapping();TLE;
// int t;cin>>t;while(t -- )
solve();
// {solve(); }
return 0;
}
/*样例区
*/
//------------------------------------------------------------