题意
你有若干个1,2,3,4
问是否可以用这些数构成一个数列,使得该数列相邻元素差的绝对值不超过1
题解
当只有三种数时
前两种数可以任意构成数列
可以发现波浪型数列可以用最小的代价消耗第三种数的个数
那么有四种数时最优解一定是某种波浪数列
构造即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=400000+10;
int A[maxn];
int main(){
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
int a,b,c,d;
scanf("%d %d %d %d",&a,&b,&c,&d);
if(a==b+1&&c==0&&d==0){
puts("YES");
for(int i=1;i<=b;i++)
printf("0 1 ");
printf("0\n");
return 0;
}
if(c+1==d&&a==0&&b==0){
puts("YES");
for(int i=1;i<=c;i++)
printf("3 2 ");
printf("3\n");
return 0;
}
if(b-a<0||c-d<0){
puts("NO");
return 0;
}
b-=a,c-=d;
if(abs(b-c)>1){
puts("NO");
return 0;
}
puts("YES");
if(b>c)
printf("1 ");
for(int i=1;i<=a;i++)
printf("0 1 ");
for(int i=1;i<=d;i++)
printf("2 3 ");
for(int i=1;i<=min(b,c);i++)
printf("2 1 ");
if(c>b)
printf("2 ");
return 0;
}