Codeforces Round #604 (Div. 2) D - Beautiful Sequence(枚举+构造)

在这里插入图片描述
题意:给你a个0,b个1,c个2,d个3,要你构造出任意一个满足相邻数字差值为1的序列。
思路:这道题大佬好像有什么高级算法可以解。。。然而孱弱只会枚举QAQ,这题枚举也可以过,但你得考虑得很仔细。我大体得思路就是先配01和23,然后再考虑12,因为1和2的话他们都有两个数可以和它配对,0和3只有一个数可以配对,按这个思路枚举之后再特判一下一些极端情况。比如 0 0 2 3这个???

#include <bits/stdc++.h>
using namespace std;
int a,b,c,d;
int main()
{
	scanf("%d%d%d%d",&a,&b,&c,&d);
	int one=b,two=c;
	int t1=b-a,t2=c-d;
	if(a==b&&a==0)
	{
		if(abs(d-c)>1) {
			puts("NO");
			return 0;
		}
		puts("YES");
		if(c>=d){
			for(int i=1;i<=d;++i) printf("2 3 ");
			if(c>d) printf("2");
		}
		else {
			for(int i=1;i<=c;++i) printf("3 2 ");
		printf("3");
		}
		return 0;
	}
	if(c==d&&c==0)
	{
		if(abs(a-b)>1) {
			puts("NO");
			return 0;
		}
		puts("YES");
		if(a>=b){
			for(int i=1;i<=b;++i) printf("0 1 ");
			if(a>b) printf("0");
		}
		else {
			for(int i=1;i<=a;++i) printf("1 0 ");
		printf("1");
		}
		return 0;
	}
	if(a>b||d>c||abs(t1-t2)>1) {
		puts("NO");return 0;
	}
	puts("YES");
	b-=a;c-=d;
	if(b>c)
	{
		for(int i=a;i>=1;--i) printf("1 0 ");
		for(int i=two-d;i>=1;--i) printf("1 2 ");
		printf("1 ");
		for(int i=d;i>=1;--i) printf("2 3 ");
	}
	else if(b<c)
	{
		for(int i=a;i>=1;--i) printf("0 1 ");
		for(int i=one-a;i>=1;--i) printf("2 1 ");
		printf("2 ");
		for(int i=d;i>=1;--i) printf("3 2 ");
	}
	else {
		if(b==c&&b==0)
		{
			for(int i=a;i>=1;--i) printf("0 1 ");
			for(int i=d;i>=1;--i) printf("2 3 ");
			return 0;
		}
		for(int i=a;i>=1;--i) printf("1 0 ");
		for(int i=one-a;i>=1;--i) printf("1 2 ");
		for(int i=d;i>=1;--i) printf("3 2 ");
	}
}
发布了39 篇原创文章 · 获赞 0 · 访问量 937

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104102819