[NOIp pj 2007][Luogu P1095] 守望者的逃离

一道简单的\(dp\),主要在于进行了\(2\)\(dp\)来解题

以时间为\(dp\)条件,路程为代价,\(dp[i]\)表示i时刻最远路程。

第一次只考虑使用闪现,第二次在闪现的基础上考虑奔跑。

#include<bits/stdc++.h>

using namespace std;

inline int read() {
	int ans=0;
	char last = ' ',ch =getchar();
	while(ch>'9'||ch<'0') last=ch,ch=getchar();
	while(ch>='0'&&ch<='9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar();
	if(last=='-') ans=-ans;
	return ans;
}

int m,s,T;
int dp[300010];

int main() {
	m=read();
	s=read();
	T=read();
	for(int i=1;i<=T;i++) {
		if(m>=10) {
			dp[i]=dp[i-1]+60;
			m-=10;
		}
		else {
			dp[i]=dp[i-1];
			m+=4;
		}
	}
	for(int i=1;i<=T;i++) {
		dp[i]=max(dp[i],dp[i-1]+17);
		if(dp[i]>=s) {
			printf("Yes\n%d",i);
			return 0;
		}
	}
	printf("No\n%d",dp[T]);
	return 0;
}
posted @ 2020-01-02 16:35  Sweetness  阅读(155)  评论(0编辑  收藏  举报