2024年蓝桥杯小白赛第八场 小蓝的跳跃 知识点:dp

80 阅读1分钟

6.小蓝的跳跃【算法赛】 - 蓝桥云课 (lanqiao.cn)

思想

贪心

求一下最大值最小值,最大值里面肯定全是1,没有-1。假设x比最大值大,那么小蓝怎么走都走不到x。如果x比最大值小,那么小蓝就看可以走-1的格子,把心情调到x。

同理,最小值一定全是-1相加的结果,如果x比最小值还小,那么小蓝怎么走都无法达到x心情。如果x比最小值大,那么小蓝可以走价值为1的格子调整心情为x。

因此答案一定在最小值,最大值之间。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int f[N],g[N];
void solve()
{
	int n,x;cin>>n>>x;
	
   vector<int>a(n+5);
	for(int i=1;i<=n;i++)cin>>a[i];

    f[1]=g[1]=a[1];
    
    for(int i=2;i<=n+1;i++)
    {
    	f[i]=max(f[i-1],f[i-2])+a[i];
    	g[i]=min(g[i-1],g[i-2])+a[i];
	}
 
if(x>=g[n+1]&&x<=f[n+1])cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
int main()
{
	int t;cin>>t;
	while(t--)
	{
		solve();
	}

return 0;	
}