Codeforces 1265D Beautiful Sequence

思路:

1.首先判断两个情况(1)b<a;此时需要c=d=0a=b+1(2)c<d,此时需要a=b=0d=c+1
2.判断完之后就舒服了呀,因为肯定有b>=a&&c>=d;我们首先排第一个序列,把0全部排完,我们可以得到0101...01,再排尾部的序列把3全部排完,得到2323...23
3.此时我们只剩12了,大家想想,中间的序列一定是2121...21呀,就这样排,数量少的那个就会被用完了;
4.此时如果1 2都用完了就把三个序列拼起来输出即可,如果有一个数没用完,如果多出来的数量大于1那就没法组成合法序列了,因为没地方放呀;如果只多一个出来,是1就补在序列最前面(即0的前面),是2就补在最后面咯;(比赛时比较紧张,思路不是很清晰,写出来的代码较冗长)

update:

学习到了一个新思路,0 1 2 3都可以成为第一个字符,那我们就遍历它们,让它们都成为第一个字符,然后每次遍历中,第一个字符的下一个字符可以是相邻的,那么我们就模拟一下,最后如果不能跳到相邻的就break,出去如果字符都用完了,就说明组成了合法的序列,否则就继续遍历下一个数为首个字符;(具体看代码,较简短)

代码(比赛时,较冗长):
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+99;
int t[maxn];
int mid[maxn];
int tt[maxn];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	int a,b,c,d; cin>>a>>b>>c>>d;
	int pos1=0;
	if(b<a){
		if((c||d)||b+1!=a){
			cout<<"NO"; return 0;
		}
		else{
			cout<<"YES\n"<<0;
			while(b--) cout<<" 1 0";return 0;
		}
	}
	if(c<d){
		if((a||b)||c+1!=d){
			cout<<"NO"; return 0;
		}else{
			cout<<"YES\n"<<3;
			while(c--) cout<<" 2 3";return 0;
		}
	}
	while(a){
		t[pos1++]=0;--a;t[pos1++]=1;--b;
	}
	int pos2=0;
	while(d){
		tt[pos2++]=2;c--;tt[pos2++]=3;d--;
	}
	int pos3=0;
	while(b&&c){
		mid[pos3++]=2;c--;mid[pos3++]=1;b--;
	}
	if(b>1||c>1){
		cout<<"NO"; return 0;
	}
	if(b){
		cout<<"YES\n"<<1;
		for(int i=0;i<pos1;i++) cout<<' '<<t[i];
		for(int i=0;i<pos3;i++) cout<<' '<<mid[i];
		for(int i=0;i<pos2;i++) cout<<' '<<tt[i];return 0;
	}
	cout<<"YES\n";bool flag=false;
	for(int i=0;i<pos1;i++){
		flag=true;
		if(i!=0) cout<<' ';
		cout<<t[i];
	}
	for(int i=0;i<pos3;i++){
		if(flag||i!=0) cout<<' ';
		flag=true;
		cout<<mid[i];
	}
	for(int i=0;i<pos2;i++){
		if(flag||i!=0) cout<<' ';
		flag=true;
		cout<<tt[i];
	}
	if(c){
		if(flag) cout<<' ';
		cout<<2;return 0;
	}	
	return 0;
}

代码(update):

#include<bits/stdc++.h>
using namespace std;
int a[10],t[10];
int main(){
	for(int i=0;i<4;i++) cin>>a[i];
	for(int i=0;i<4;i++){
		if(a[i]==0) continue;
		for(int j=0;j<4;j++) t[j]=a[j];
		vector<int> v;
		int x=i;
		while(1){
			v.push_back(x); t[x]--;
			if(x!=3&&t[x+1]!=0) x++;
			else if(x!=0&&t[x-1]!=0) x--;
			else break;
		}
		if(!t[0]&&!t[1]&&!t[2]&&!t[3]){
			puts("YES");
			for(int x:v) cout<<x<<' ';return 0;
		}
	}
	puts("NO");
	return 0;
}
posted @ 2019-12-06 18:35  YuhanのBlog  阅读(100)  评论(0编辑  收藏  举报