牛客周赛 Round 34

牛客周赛 Round 34

比赛链接

感觉比以往难度有些大,但是大佬们该强的还是很强啊

小红的字符串生成

思路

就两个字符,如果字符相同只能组成两种,不同则可以组成四种

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin()+1,x.end()
#define ct(x) cout<<x<<endl

void solve(){
	char a,b;
	cin>>a>>b;
	if(a!=b){
		cout<<4<<endl;
		cout<<a<<endl;
		cout<<b<<endl;
		cout<<b<<a<<endl;
		cout<<a<<b<<endl;
		return ;
	}
	else{
		cout<<2<<endl;
		cout<<a<<endl;
		cout<<a<<a<<endl;
		return ;
	}
	
	
}

signed main(){
	ios::sync_with_stdio(false); cin.tie(nullptr);
	int t=1;
	// cin>>t;
	
	while(t--){
		solve();
	}
	return 0;

}

小红的非排列构造

思路

这个题我一开始做的比较蒙,原来是自己一开始没有读懂题意,罪过罪过
我们可以用map存储一下每个数字出现的个数,如果没有出现n个,或者1-n中有的数字一次也没出现则一开始就是一个非排列,因此不需要进行操作,否则我们只需要操作一个数字就可以

Code

#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
#define all(x) x.begin(),x.end()

void solve(){
	int n;
	cin>>n;
	std::vector<int> a(n+1);
	
	std::map<int, int> mp;
	set<int> s;

	for(int i=1;i<=n;i++){
		cin>>a[i];
		mp[a[i]]++;
		// s.insert(a[i]);
	}
	if(mp.size()!=n){
		cout<<0<<endl;
		return ;
	}
	for(int i=1;i<=n;i++){
		if(mp[i]==0){
			cout<<0<<endl;
			return ;
		}

	}
	cout<<1<<endl;
	if(a[1]>=n){
		cout<<1<<" "<<a[1]-1<<endl;
		return ;
	}
	else{
		cout<<1<<" "<<a[1]+1<<endl;
		return ;
	}
	
	
}

signed main(){
	ios::sync_with_stdio(false); cin.tie(nullptr);
	int t=1;
	// cin>>t;
	
	while(t--){
		solve();
	}
	return 0;

}

小红的数字拆解

思路

我们如果想得到尽可能多的整数,那我们就需要对所有为偶数的位置上进行切断就可以,由于数字很大,所以我们考虑用字符串进行操作和读取,其次题目要求要从小到大输出每个偶数,所以我们做一个字符串的排序就可以了,我就在自定义字符串排序中犯了一个天大的错误

Code

#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
#define all(x) x.begin(),x.end()

bool cmp(string a,string b){
	if(a.size()==b.size()){
		for(int i=0;i<a.size();i++){
			int x=a[i]-'0';
			int y=b[i]-'0';
			if(x==y){
				continue;
			}
			else{
				return x<y;
			}
		}
	}
	return a.size()<b.size();
	

}

void solve(){
	string s;
	cin>>s;
	std::vector<string> a;
	string s1="";

	for(int i=0;i<s.size();i++){
		s1+=s[i];
		if((s[i]-'0')%2==0){
			a.emplace_back(s1);
			s1="";
		}
		else{
			// s1+=s[i];
			continue;
			
		}
	}
	sort(all(a),cmp);
	for(auto x:a){
		cout<<x<<endl;
		
	}
	return ;

}

signed main(){
	ios::sync_with_stdio(false); cin.tie(nullptr);
	int t=1;
	// cin>>t;
	
	while(t--){
		solve();
	}
	return 0;

}

小红的陡峭值

思路

构造序列的问题,很遗憾我这题只拿了188.89,应该是有地方写混乱了,这个题只要分类讨论再根据情况进行构造就行,最后我才发现原来我写的代码会让出现1的时候0的位置还是0,这样是不对的,我们只能让其他等于0的位置变成2

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin(),x.end()



void solve(){
    int n;
    cin>>n;
    std::vector<int> a(n+1);
    for(int i=1;i<=n;i++) cin>>a[i];
    int res=0;
    std::set<int> s;

    std::map<int, int> mp;
    for(int i=1;i<n;i++){
        if(a[i]!=0&&a[i+1]!=0){
            res+=abs(a[i+1]-a[i]);

        }
        s.insert(a[i]);
        mp[a[i]]++;

    }
    s.insert(a[n]);
    mp[a[n]]++;
    // cout<<(*s.end())<<endl;
    // return ;
    // for(auto x:s){
    //  cout<<x<<" ";

    // }
    // returnn ;
    if(res==1&&mp[0]==0){
        for(int i=1;i<=n;i++){
            cout<<a[i]<<" ";
        }
        return  ;
        
    }
    if(res>1||s.size()>3){
        cout<<-1<<endl;
        return ;
    }

    else{
    
        if(s.size()==1){
            if(a[1]!=0){
                cout<<-1<<endl;
                return ;
            
            }
            for(int i=1;i<=n;i++){
                if(i!=n){
                    cout<<1<<" ";
                }
                else{
                    cout<<2<<endl;

                }
            }
        }
        else if(s.size()==2){
            bool f=false;
            for(auto it:s){
                if(it==0){
                    f=true;
                }
            }
            if(!f){
                if(res==1){//不存在0且陡峭值不等于1
                    for(int i=1;i<=n;i++){
                        cout<<a[i]<<" ";
                    }
                    return ;
                }
                else{
                    cout<<-1<<endl;
                    return ;

                }
            }
            // int x= *s.end();
            int x=-1;
            for(auto it:s){
                if(it!=0){
                    x=it;
                }
            }
            // cout<<x<<endl;
            
            int idx=-1;
            // cout<<x<<endl;
            
            if(mp[x]==1){
                for(int i=1;i<=n;i++){
                    if(a[i]==x){
                        idx=i;
                        break;

                    }
                }
                if(idx==1){
                    if(x>1){
                        for(int i=1;i<=n;i++){
                            if(i!=1){
                                cout<<x-1<<" ";
                            }
                            else{
                                cout<<x<<" ";
                            }
                        }
                        return ;
                    }
                    else{
                        for(int i=1;i<=n;i++){
                            if(i!=1){
                                cout<<x+1<<" ";
                            }
                            else{
                                cout<<x<<" ";
                            }
                        }
                        return  ;
                    }
                }
                if(x!=1){
                    for(int i=1;i<=n;i++){
                        if(i<idx){
                            cout<<x-1<<" ";
                        }
                        else{
                            cout<<x<<" ";
                        }
                    }
                }
                else{
                    for(int i=1;i<=n;i++){
                        if(i<idx){
                            cout<<x+1<<" ";
                        }
                        else{
                            cout<<x<<" ";
                        }
                    }
                }

            }
            else{
                std::vector<int> b;
                for(int i=1;i<=n;i++){
                    if(a[i]==x){
                        b.push_back(i);
                    }
                }
                if(b[0]!=1||b[b.size()-1]!=n){
                    if(b[0]!=1){
                        for(int i=1;i<=n;i++){
                            if(i<b[0]){
                                cout<<x+1<<" ";
                            }
                            else{
                                cout<<x<<" ";
                            }
                        }
                        return ;

                    }
                    else{
                        for(int i=1;i<=n;i++){
                            if(i>b[b.size()-1]){
                                cout<<x+1<<" ";
                            }
                            else{
                                cout<<x<< " "; 
                            }
                        }
                        return ;
                    }
                }
                else{
                    cout<<-1<<endl;
                    return ;

                    
                }
            }
        }
        else if(s.size()==3){
            bool f=false;
            for(auto it:s){
                if(it==0){
                    f=true;
                }
            }
            if(!f){
                cout<<-1<<endl;
                return ;
                
            }
            int x=-1,y=-1;
            // for(auto it:s){
            //  if(it!=0){
            //      if(x==-1){
            //          x=it;
            //      }
            //      else{
            //          y=it;
                        
            //      }
            //  }
            // }
            // cout<<x<<" "<<y<<endl;
            // return ;
            for(int i=1;i<=n;i++){
                if(a[i]!=0){
                    if(x==-1){
                        x=a[i];
                    }
                    else{
                        if(a[i]!=x){
                            y=a[i];
                        }
                    }
                }
            }
            // cout<<x<<" "<<y<<endl;
            // return ;
            if(abs(x-y)!=1){
                cout<<-1<<endl;
                return  ;
                
            }
            std::vector<int> c,d;
            for(int i=1;i<=n;i++){
                if(a[i]==x){
                    c.push_back(i);
                }
                if(a[i]==y){
                    d.push_back(i);
                }
            }
            if(c[c.size()-1]>d[0]){
                cout<<-1<<endl;
                return ;
            }
            for(int i=1;i<=n;i++){
                if(i<d[0]){
                    cout<<x<<" ";
                }
                else{
                    cout<<y<<" ";
                }
            }
            return ;
            
        }
    }



}

signed main(){
    ios::sync_with_stdio(false); cin.tie(nullptr);
    int t=1;
    // cin>>t;
    
    while(t--){
        solve();
    }
    return 0;

}

小红的树形 dp

思路

dfs一下,让根节点是'd'或'p'都变一下,如果能出现合法字符串即为可以,否则不行

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
vector<int> g[N];
string s1;

bool dfs(int x,int y,char a){
    if(s1[x]!='?'&&s1[x]!=a){
        return false;
    }
    s1[x]=a;
    
    if(a=='d'){
        a='p';
    }
    else{
        a='d';
    }
    for(int i=0;i<g[x].size();i++){
        if(g[x][i]==y){
            continue;
        }
        if(s1[g[x][i]]=='?'||s1[g[x][i]]==a){
            bool f=dfs(g[x][i],x,a);
            if(!f){
                return false;
            }

        }
        else{
            return false;
        }
    }
    return true;
    
}

void solve(){
    int n;
    cin>>n;
    string s;
    cin>>s;
    s=" "+s;
    for(int i=1;i<n;i++){
        int x,y;
        cin>>x>>y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    s1=s;
    bool f=false;
    if(s1[1]=='d'||s1[1]=='?'){
        f=dfs(1,-1,'d');
        if(f){
            for(int i=1;i<=n;i++){
                cout<<s1[i];
            }
            return ;
        }
    }
    s1=s;

    if(s1[1]=='p'||s1[1]=='?'){
        f=dfs(1,-1,'p');
        if(f){
            for(int i=1;i<=n;i++)
                cout<<s1[i];
            return ;
        }
    }
    cout<<-1<<endl;
    return ;

}

signed main(){
    int t=1;
    while(t--){
        solve();
    }
    return 0;
    
}
posted @ 2024-02-26 20:24  du463  阅读(36)  评论(0编辑  收藏  举报