River Jumping

题目链接:River Jumping


显然我们可以发现如果连续的3个之中,最后一个减去第一个都小于s则无解,否则我们可以贪心能跳就跳,因为连续两个之中小于s是不影响的,因为我们特判了连续3个的情况。

然后我们最后反向扫一遍第一次未跳的,如果都是满足的则输出。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int n,m,s,a[N],vis[N];
vector<int> res;
signed main(){
	cin>>n>>m>>s;
	for(int i=1;i<=m;i++)	cin>>a[i]; a[m+1]=n;
	if(a[m+1]<s)	return puts("NO"),0;
	if(!m)	return puts("YES"),cout<<1<<' '<<0,0;
	for(int i=2;i<=m+1;i++)	if(a[i]-a[i-2]<s)	return puts("NO"),0;
	int pre=0;
	for(int i=1;i<=m;i++)	if(a[i]-pre>=s&&n-a[i]>=s)	res.push_back(i),pre=a[i],vis[pre]=1;
	res.push_back(m+1); pre=n;
	for(int i=m;i>=0;i--)	if(!vis[a[i]]){
		if(pre-a[i]<s)	return puts("NO"),0;	pre=a[i]; res.push_back(i);
	}
	puts("YES");
	for(int i:res)	cout<<i<<' ';
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章