2022.2.27 队内个人训练赛(上)

Posted yeah17981

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022.2.27 队内个人训练赛(上)相关的知识,希望对你有一定的参考价值。

小打了个第一然后就结束前半小时就溜去打短兵了

由于这次每题都来自于不同的场所以就每题来个链接吧

A - To xor or not to xor

传送门Problem - 99999275 - Codeforces

给n个数,求一个字迹使得全部的异或和最大

高斯消元,待补

B - GCD Problem

传送门Problem - 1617B - Codeforces

给一个数n,满足a+b+c=n且gcd(a,b)=c,求a、b、c

首先,令b=k1*c,a=k2*c,则k1+k2=n/c-1,k1和k2互质

因此直接点,c=1(前面都是废话是吧),所以此时a和b要互质

n为偶数时,n-1为奇数,直接构造n-3(>=3)和2,绝对互质

n为奇数时,n-1是偶数,(n-1)/2如果是奇数的话一个-2一个+2,因为a-b=4时,如果他们有公因数只能为2,又因为奇数+2还是奇数所以不可能。如果是偶数的话一个-1一个+1

#include<bits/stdc++.h>
using namespace std;
int main()
	int t;
	cin >> t;
	long long n;
	while(t--)
		cin >> n;
		n--;
		if(n & 1)
        
			long long ans = n / 2;
			cout << ans << " " << ans + 1 << " " << 1 << endl;
		 
        else    
        
			long long ans = n / 2;
			if(ans & 1)
            
				cout << ans - 2 << " " << ans + 2 << " " << 1 << endl;
			
            else
            
				cout << ans - 1 << " " << ans + 1 << " " << 1 << endl;
			
		
	 
	return 0;

C - AB Balance 

传送门:Problem - 1606A - Codeforces

给一串a和b,求最小修改次数使ab个数=ba个数

刚好这题做过,虽然当时是疯狂if的

正解是如果a开头的话(b同理,省略),ab……ba中两个个数相同,中间随便替换多个b为a结果不变,因此只要把首尾俩改成一样的就成

D - Geolocation 

传送门:Problem - 1220G - Codeforces

待补

E - Penalty 

传送门:Problem - 1553C - Codeforces

1表示必进,0表示必不进,?表示可能进也可能不进,给十个字符代表每个球,两支队伍轮流踢,求最少到第几个球可以定输赢

题解:两个循环,第一个循环a遇到?必进,b遇到?必不进,当二者分数差比分数低的那方剩余球数多则输出。同理

#include<iostream>
#include<algorithm>
#include<cmath>

char s[200];
int ab,ba;

using namespace std;
int main()

	long long  _,n,m;
	cin >> _;
	while (_--)
	
		cin >> s;
		int a=0, b=0;
		int a1=5, b1=5;
		int num1=10,num2=10;
		for (int i = 0; i < 10; i++)
		
			if (s[i] == '1')
			
				if (i % 2 == 0)
				
					a++;
				
				else
				
					b++;
				
			
			if (s[i] == '?')
			
				if (i % 2 == 0)
				
					a++;
				
			
			if (i % 2 == 0)
			
				a1--;
			
			else
			
				b1--;
			
			if (a - b > b1)
			
				num1 = i+1;
				break;
			
		
		a=0;b=0;
		a1=5; b1=5;
		num2=10;
		for (int i = 0; i < 10; i++)
		
			if (s[i] == '1')
			
				if (i % 2 == 0)
				
					a++;
				
				else
				
					b++;
				
			
			if (s[i] == '?')
			
				if (i % 2 == 1)
				
					b++;
				
			
			if (i % 2 == 0)
			
				a1--;
			
			else
			
				b1--;
			
			if (b-a > a1)
			
				num2 = i+1;
				break;
			
		cout << min(num1, num2)<<"\\n";
	

F - Delete Two Elements 

传送门:​​​​​​Problem - 1598C - Codeforces

给n个元素,求有多少种情况满足删除其中两个元素后平均值不变

首先如果平均值不是整数或者x.5结果都为0,因为删除的两个元素的平均数只能为整数或x.5

因此我们只需要知道每个数对应的被平均数出现过几次就可以了

遇到和平均数相同的数时注意要减去自己

#include<bits/stdc++.h>
using namespace std;
int a[300005];
map <int, int> ma;


int main()

	long long  _, n, m=0,k;
	cin >> _;
	while (_--)
	
		cin >> n;
		ma.clear();
		m=0;
		for (int i = 1; i <= n; i++)
		
			cin >> a[i];
			m += a[i];
			ma[a[i]]++;
		
		k = m / n;
		if (m%n!=0)
		
			if (n % 2 == 1)
			
				cout << "0\\n";
				continue;
			
			else
			
				if (k * n + n / 2 != m)
				
					cout << "0\\n";
					continue;
				
			
			k = k * 2 + 1;
		
		else
		
			k = k * 2;
		
		long long sum = 0;
		for (int i = 1; i <= n; i++)
		
			m = k - a[i];
			if (a[i] * 2 == k)
			
				sum--;
			
			sum+=ma[m];
		
		cout << sum / 2<<"\\n";
	

图书馆要闭馆了,溜回宿舍了,明天再更新剩余部分

以上是关于2022.2.27 队内个人训练赛(上)的主要内容,如果未能解决你的问题,请参考以下文章

队内赛 T2数学巡回的梦魇之神喜欢数列

队内赛 T3区间DP大哥扛纵连

队内ACM赛

队内赛T1贪心日常

队内赛 T1数学暴力多项式滚出OI

luogu 11.8 队内赛 暴力T1 Lyrith -迷宮リリス-