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 队内个人训练赛(上)的主要内容,如果未能解决你的问题,请参考以下文章