【洛谷P1095】守望者的逃离

链接

第一次知道dp还能分开写。

关于这个题,最开始一直没有脱离以前的dp模板,想压到一个dp里,这么做显然会姹紫嫣红。

那么就可以考虑将dp分开。

首先罗列出状态,即这一秒可以干什么:

1.跑17米

2.不动,加4点血

3.使用大招,跑60米,耗10点血

那么,就可以把这三个状态根据是否有血量参与,分成两组处理——1,23 。

用贪心的思想来看,在能直接使用大招的情况下,必然使用大招更好,所以先把能用的次数用了。

然后开始(回血—大招)这个过程。这是我们一遍循环(1—T)就可以处理的。

随后进行第二次循环,把17米硬跑的情况加进去比较,就可以了。

代码如下

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int m,s,t;
int dp[300005];
int main()
{
	scanf("%d%d%d",&m,&s,&t);
	for(int i=1;i<=t;i++)
	{
		if(m>=10){
			m-=10;
			dp[i]=dp[i-1]+60;
		}//使用大招 
		else{
			dp[i]=dp[i-1];
			m+=4;//回血 
		}
	}
	for(int i=1;i<=t;i++)
	{
		dp[i]=max(dp[i],dp[i-1]+17);//考虑17米的状态 
		if(dp[i]>=s){
			printf("Yes\n%d",i);return 0;
		}
	}
	printf("No\n%d",dp[t]);
 } 

猜你喜欢

转载自blog.csdn.net/Sakura_Chiyo/article/details/82319773