首页 > 其他分享 >牛客周赛34(A~E)

牛客周赛34(A~E)

时间:2024-02-26 09:55:42浏览次数:24  
标签:周赛 int rep long 34 牛客 solve pair define

A

两种情况

  1. 两个字符相同只有2
  2. 两个字符不相同4
#include <bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define vi vector<int>


using namespace std;

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

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
//	freopen("1.in", "r", stdin);
	int _;
//	cin>>_;
//	while(_--)
	solve();
	return 0;
}

B

答案只有两种情况0和1
如果已经不是排列答案是0
否则一定可以通过修改一个数变为非排列

#include <bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define vi vector<int>


using namespace std;

void solve() {
	int n;
	cin>>n;
	set<int>s;
	bool st=false;
	rep(i,1,n){
		int val;
		cin>>val;
		if(s.count(val)!=0||val>n||val<1){
			st=true;
		}
		s.insert(val);
	}
	if(st){
		cout<<0<<endl;
	}else{
		cout<<1<<endl;
		cout<<1<<' '<<n+1<<endl;
	}
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
//	freopen("1.in", "r", stdin);
	int _;
//	cin>>_;
//	while(_--)
	solve();
	return 0;
}

C

从高位往低位贪心,如果是偶数,就分开。
最后需要注意一下用\(vector\)排序\(string\)如何按字典序排序

#include <bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define vi vector<int>


using namespace std;

bool cmp(string a, string b) {
	if(a.size()!=b.size())	return a.size()<b.size();
	return a+b < b+a; //按字典序从小到大排列
}

void solve() {
	string s;
	cin>>s;
	int n=s.size()-1;
	vector<string>ans;
	int cur=0;
	rep(i,0,n){
		int c=s[i]-'0';
//		cout<<c<<endl;
		string res;
		if(c%2==0){
			rep(j,cur,i){
				res+=s[j];
			}
			ans.pb(res);
			cur=i+1;
		}
	}
	sort(ans.begin(),ans.end(),cmp);
	for(auto it:ans){
		cout<<it<<endl;
	}
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
//	freopen("1.in", "r", stdin);
	int _;
//	cin>>_;
//	while(_--)
	solve();
	return 0;
}

D

这道分类讨论刚开始写的很乱感觉有点不好写,确实不太好写
参考了qfl的代码感觉用队列写确实简洁了很多。
分类讨论
首先通过观察我们可以知道,如果有答案最后的答案,一定是前面一段全部是一样的,后面一段全部是一样的。
也就是\(aaaabbbb\)这种形式
我们可以通过把每一个0变为离他最近的非零数字,然后去check是否合法,来判断和构造解。
那种情况是可能合法的。
\(ans\):我们用\(ans\)来表示相邻项的差的绝对值
当\(ans>1\):一定不合法
当\(ans=1\):合法,且经过暴力修改得到的解就是构造方案
当\(ans=0\):需要去看\(a[1]\)或者\(a[n]\),是否能产生1的贡献。
为什么考虑\(1、n\)因为1个数出现在中间的话一定会产生2的贡献
如果\(a[1]\)或\(a[n]\)有一个在最开始为0则有解,如果同时都不为0则无解,
有解的话,在修改完的\(a[1]或a[n]\)上加1就是构造的解。

#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define vi vector<int>

using namespace std;
const int maxn=1e5+10;
int n;
int a[maxn],vis[maxn];

void solve() {
	cin>>n;
	queue<int>q;
	rep(i,1,n){
		cin>>a[i];
		if(a[i]){
			q.push(i);
			vis[i]=1;
		}
	}
	//全部都是0构造2 1 1 1 1 ...
	if(q.size()==0){
		cout<<2<<' ';
		rep(i,1,n-1){
			cout<<1<<' ';
		}
	}
	//否则找到每个0最近的相同的非零的数,把它变为那个数
	while(q.size()){
		auto t=q.front();
		q.pop();
		if(t>1&&a[t-1]==0){
			a[t-1]=a[t];
			q.push(t-1);
		}
		if(t<n&&a[t+1]==0){
			a[t+1]=a[t];
			q.push(t+1);
		}
	}
	int ans=0;
	rep(i,2,n){
		ans+=abs(a[i]-a[i-1]);
	}

	if(ans>1){
		cout<<-1<<endl;
		return;
	}else if(ans==0){
		//看第一个数和最后一个数最开始是否为0
		if(vis[1]&&vis[n]){
			cout<<-1<<endl;
//			cout<<"AAAAAAA"<<endl;
			return;
		}
		if(!vis[1]){
			a[1]++;
		}else{
			a[n]++;
		}
		rep(i,1,n){
			cout<<a[i]<<' ';
		}
	}else{
		rep(i,1,n){
			cout<<a[i]<<' ';
		}
	}
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	freopen("1.in", "r", stdin);
	int _;
//	cin>>_;
//	while(_--)
	solve();
	return 0;
}

E

bfs直接去染色然后判断即可。


#include <bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define pdd pair<double,double>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define vi vector<int>

using namespace std;

void solve() {
	int n;
	cin>>n;
	string s;
	cin>>s;
	vector<vi>g(n+1);
	rep(i,1,n-1){
		int u,v;
		cin>>u>>v;
		u--;
		v--;
		g[u].pb(v);
		g[v].pb(u);
	}
	int cnt=0;
	rep(i,0,n-1){
		if(s[i]=='?'){
			cnt++;
		}
	}
	auto topsort=[&](){
		queue<int>q;
		rep(i,0,n-1){
			if(s[i]!='?'){
				q.push(i);	
			}
		}	
		while(q.size()){
			auto u=q.front();
			q.pop();
			for(auto v:g[u]){
				if(s[v]=='?'){
					if(s[u]=='d'){
						s[v]='p';
					}else{
						s[v]='d';
					}
					q.push(v);
				}
				
			}
		}
	};
	auto check=[&](){
		rep(i,0,n-1){
			for(auto v:g[i]){
				if(s[i]==s[v]){
					return false;
				}
			}
		}
		return true;
	};
	if(cnt==n){
		s[0]='p';
	}
//	cout<<cnt<<endl;
//	exit(0);
	topsort();
	if(check()){
		cout<<s<<endl;
	}else{
		cout<<-1<<endl;
	}
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
//	freopen("1.in", "r", stdin);
	int _;
//	cin>>_;
//	while(_--)
	solve();
	return 0;
}

标签:周赛,int,rep,long,34,牛客,solve,pair,define
From: https://www.cnblogs.com/cxy8/p/18033696

相关文章

  • 牛客周赛 Round 34
    牛客周赛Round34小红的字符串生成代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pair<ll,pair<ll,ll>>;voidsolve()......
  • 牛客寒假4到6补题
    牛客寒假4:F:来点每日一题题意:给定一个长度为n的数组,任意选6个数,6个数得分为 ((a-b)*c-d)*e-f,问最大能得到多少分解:n*n的dp,暴力枚举每一个数字v[i],f[i]表示以第i个位置结尾的得分最大是多少 voidsolve(){intn;cin>>n;vector<int>v(n+10......
  • HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)
    HUAWEIProgrammingContest2024(AtCoderBeginnerContest342)A-Yay!代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=p......
  • 2024牛客寒假算法基础集训营6
    A.欧拉筛处理出素数直接3重暴力循环找#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fboolis_prime[N];//是否是质数,0为是,1为不是intprime[N];//质数数组inttop=1;//质数的下标intmin_p[N];//最小......
  • 2024牛客寒假算法基础集训营6 H 纷乱的红线 题解
    Question2024牛客寒假算法基础集训营6H纷乱的红线小红拿到了一个圆,以及平面上有\(n\)个点(保证没有三点共线)。现在小红将随机取\(3\)个点画一个三角形,她想知道这个三角形和圆的交点数量的期望是多少?Solution考虑到\(n\le1000\)可以枚举每一条线,计算这一条线和圆的交......
  • 2024牛客寒假算法基础集训营6 G 人生的起落 题解
    Question2024牛客寒假算法基础集训营6G人生的起落定义一个三元组\((x,y,z)\)是“v-三元组”当且仅当该三元组满足以下条件:\(x=z\)\(x>y\)现在需要你构造一个\(n\)个正整数组成的数组,所有元素之和恰好等于\(S\),且恰好有\(k\)个长度威\(3\)的连续子数组......
  • Atcoder Beginner Contest 342 全题解
    A-Yay!题意给定字符串\(s\)已知该字符串中只有一个字符与其他字符不同求这个字符思想开一个数组\(cnt_i\)来记录\(s\)中每个字符出现的次数,一个数组\(first_i\)来记录\(s\)中每个字符第一次出现的下标。选择\(cnt_i=1\)的\(i\)输出\(first_i\)......
  • 牛客六
    1.B爱恨的纠葛(先将ab排序,再二分查找ab元素间差值最小的一对,再从a和c中找出对应下标(因为第二个数组不能动),再交换a的两个下标位置的值)1#include<bits/stdc++.h>2usingnamespacestd;3inta[1000005];4intb[1000005];5intc[1000005];6voidsolve(intn)7{......
  • AtCoder Beginner Contest 342
    A-Yay!(abc342A)题目大意给定一个字符串,两个字符,其中一个只出现一次,找出它的下标。解题思路看第一个字符出现次数,如果是\(1\)则就是它,否则就是不是它的字符。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){io......
  • At-abc342
    AtCoderBeginnerContest342(已更新:CD)C似曾相识的经典映射题……而只会map的蒟蒻成功又被卡住了简单的用map映射无法处理如r->a,a->r这样的多重映射,应该在先存下原本的信息,再作映射写到这突然悟了……再改改果然是没有悟一点(⊙﹏⊙),由于只处理26个字母,每次修改实时更......