思路:
1.首先判断两个情况(1)b<a
;此时需要c=d=0
且a=b+1
(2)c<d
,此时需要a=b=0
且d=c+1
2.判断完之后就舒服了呀,因为肯定有b>=a&&c>=d
;我们首先排第一个序列,把0
全部排完,我们可以得到0101...01
,再排尾部的序列把3
全部排完,得到2323...23
;
3.此时我们只剩1
和2
了,大家想想,中间的序列一定是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
"<<0;
while(b--) cout<<" 1 0";return 0;
}
}
if(c<d){
if((a||b)||c+1!=d){
cout<<"NO"; return 0;
}else{
cout<<"YES
"<<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
"<<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
";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;
}