题意:给你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 ");
}
}
qq_42479630
发布了39 篇原创文章 · 获赞 0 · 访问量 941
私信
关注