zoukankan      html  css  js  c++  java
  • Codeforces 1265D Beautiful Sequence

    思路:

    1.首先判断两个情况(1)b<a;此时需要c=d=0a=b+1(2)c<d,此时需要a=b=0d=c+1
    2.判断完之后就舒服了呀,因为肯定有b>=a&&c>=d;我们首先排第一个序列,把0全部排完,我们可以得到0101...01,再排尾部的序列把3全部排完,得到2323...23
    3.此时我们只剩12了,大家想想,中间的序列一定是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;
    }
    
  • 相关阅读:
    串学习笔记
    C深度剖析学习笔记
    记英语单词ag
    树学习笔记
    如何做好项目总结
    易学队第二次团队会议
    易学队第四次团队会议
    易学队第五次团队会议
    易学队第一次团队会议
    易学队第三次团队会议
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308760.html
Copyright © 2011-2022 走看看