Codeforces Round 968 (Div. 2) (A~D)

Codeforces Round 968 (Div. 2)

A. Turtle and Good Strings

思路

签到题,判断第一个字符和最后一个字符是否相等即可

code

void solve(){
	int n;cin >> n;
	string s;cin >> s;
	if(s[0]==s[s.size()-1]) cout << "no" << endl;
	else cout << "yes" << endl;
	return ;
}

B. Turtle and Piggy Are Playing a Game 2

思路

考点:贪心

根据最优策略,小乌龟每次选取的数都是序列中最小的数,小猪每次选取的数都是序列中最大的数
不难想到,经过若干次操作,最终的答案就是排完序后,序列的中位数

code

void solve(){
	int n;cin >> n;
	for(int i=1;i<=n;++i) cin >> a[i];
	sort(a+1,a+1+n);
	cout << a[n/2+1] << endl;
	return ;
}

C. Turtle and Good Pairs

思路

考点:贪心

如果一对整数 ( i , j ) (i,j) (i,j) 是一对好数,那么 s i = s j s_i=s_j si=sj ,无论将这对整数放到什么位置都一定满足的
因此我们只需要考虑 ( i , j ) (i,j) (i,j) 是一对令人愉快的整数

拿样例2来说:edddf
ddd这三个字符无论放什么位置他们都是互为好对数,所以不用考虑他们的位置
我们只需要考虑字符e和字符f,显然根据令人愉快的整数整数的定义,(1,2) (1,3) (1,4)都不满足,只有(1,5)满足
如果我们将字符拆散,即改成defdd,那么(1,3)就可以满足了

简单来说,我们尽量让每个字符都不连在一起,这样好对数的数量就更多

code

const int N=27;
void solve(){
	int a[N]={0};
	int n;cin >> n;
    string s;cin >> s;
	for(auto i : s) a[i-'a']++;
	while(1){
		int f=0;
		for(int i=0;i<26;++i){
			if(a[i]){
				cout << char(i+'a');
				f=1;
				a[i]--;
			}
		}
		if(f==0) break;
	}
	cout << endl;
	return ;
}

D1. Turtle and a MEX Problem (Easy Version)

思路

找规律的一道题,对于一个序列 a a a,我们先找出这个序列的mex,令找出的值为x
根据题目要求,我们可以进行任意次操作,每次操作都需要将x放入序列中

显然,我们找出这个序列的mex,然后将它加入序列在找新的mex,这个结果是最优的
在往后,我们缺少第一次的mex,所以我们不能继续执行操作,一个序列的操作数最多2次

找到这个规律题目就非常简单了,我们只需要将这n个序列执行2次操作,找出最大的x

  • 对于小于等于x的数,我们都让它变为x
  • 对于大于x的数,我们不需要做任何改变

接下来我们将这些数进行累加,运用数学的等差数列求和公式即可

code

void solve(){
	int n,m;
	cin >> n >> m;
	int mx=-1;
	for(int i=1;i<=n;++i){
		int l;cin >> l;
		set<int> s;
		for(int j=1;j<=l;++j){
		    int x;cin >> x;
		    s.insert(x);
		}
		int temp=0,f=0;
		for(int j=0;;++j){
			if(s.find(j)==s.end()){
				if(f==0) f=1;
				else{
				   temp=j;
				   break;	
				}
			}
		}
		mx=max(mx,temp);
	}
	if(m<=mx){
		cout << (m+1)*mx << endl;
	}
	else{
		cout << (mx+1)*mx+(m-mx)*(mx+1+m)/2 << endl;
	}
	return ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值