比赛的时候太蠢了。
题解 #
这题的关键在于答案的第一个数要么是最小的数要么是第二小的数,两种情况都试一下。填某一位的时候,要么是上一位加一,要么是上一位减一,先试减 1,如果没有减 1 可以用了就试加 1,如果加一也没有了那就可以停止去尝试以另一个数开头的情况了。
Code #
#include <bits/stdc++.h>
#define forn(i, n) for (int i = 0; i < (int)(n); ++i)
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define fore(i, l, r) for (int i = (int)(l); i <= (int)(r); ++i)
#define ford(i, n) for (int i = (int)(n)-1; i >= 0; --i)
#define pb push_back
#define ms(a, x) memset(a, x, sizeof(a))
#define F first
#define S second
#define endl '\n'
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long ll;
typedef pair<int, int> pii;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int a[5]={0},cnt[4],sum=0;
forn(i,4) cin>>cnt[i],a[i]=cnt[i],sum+=a[i];
int start;
forn(i,4){
if(a[i]){
start=i;
break;
}
}
vector<int> ans(sum);
bool flag=0;
for(int j=0;j<2&&!flag;j++){
forn(i,4) a[i]=cnt[i];
if(start+j>3||a[start+j]==0) break;
ans[0]=start+j;
a[start+j]--;
for(int i=1;i<sum;i++){
if(ans[i-1]==0){
if(a[1]){
ans[i]=1;
a[1]--;
}else break;
}else if(ans[i-1]==3){
if(a[2]){
ans[i]=2;
a[2]--;
}else break;
}else{
if(a[ans[i-1]-1]){
ans[i]=ans[i-1]-1;
a[ans[i-1]-1]--;
}else if(a[ans[i-1]+1]){
ans[i]=ans[i-1]+1;
a[ans[i-1]+1]--;
}else break;
}
if(i==sum-1) flag=1;
}
if(sum==1) flag=1;
}
if(flag){
cout<<"YES\n";
for(int it:ans) cout<<it<<' ';
}else cout<<"NO";
return 0;
}