首页 > 其他分享 >2.10 Codeforces Round #851 (Div. 2)

2.10 Codeforces Round #851 (Div. 2)

时间:2023-02-10 13:23:35浏览次数:47  
标签:10 cnt 851 get int sum Codeforces Div tt

A - One and Two

题意

给出长度为n的序列a,a中元素是1或2
找到一个k使a1 * a2 * a3 * .... * ak = ak+1 * ak+2 * ak+3 * ... * an

思路

统计序列中有多少个2,若是奇数个2,则不可能,若是0个,则是第一个,否则设2的数量为cnt, cnt/2个2的位置就是答案

一开始思路是当成前缀乘法一样,把序列所有值全乘起来为sum,然后从前往后枚举序列,使用cnt记录从1到i个数的乘积,sum为i + 1到n的乘积,若相等则输出当前下标,否则输出-1,不知道为什么错了

void solve() {
	int n;
	cin >> n;
	vector<int> a(n + 1);
	int cnt = 0;
	for (int i  = 1; i <= n ;i ++) {
		cin >> a[i];
		if (a[i] == 2) cnt ++;
	}
	
	if (cnt % 2 == 1) cout << -1 << endl;
	else if (cnt == 0) cout << 1 << endl;
	else {
		cnt /= 2;
		int sum = 0;
		for (int i = 1; i <= n;i ++) {
			if (a[i] == 2) sum ++;
			if (sum == cnt){
				cout << i << endl;
				return ;
			}
		}
	}
}

\[\]

B - Sum of Two Numbers

题意

给出一个n,get(n)是将n每位上的数字加起来的和,要使x + y == n 且get(x) + get(y) == get(n)

思路

其实就是先将get(n)求出,然后分出一半,对于get(n)减去这一半即可,体现在数字上

int get(int x) {
	int sum = 0;
	while (x) {
		sum += x % 10;
		x /= 10;
	}
	
	return sum;
}
 
//注意观察N的大小
void solve() {
	int n;
	cin >> n;
	int tmp = get(n);
	int x = 0, y;
	if (tmp % 2 == 1) y = tmp / 2 + 1;
	else y = tmp / 2;
	
	int tt = n;
	
	vector<int> a;
	
	while (tt) {
		int k = tt % 10;
		if (k >= y) {
			a.push_back(y);
			break;
		}else {
			a.push_back(k);
			y -= k;
		} 
		tt /= 10;
	}
	
	for (int i = a.size() - 1; i >= 0; i --) {
		x = x * 10 + a[i];
	}
	cout << n - x << ' ' << x << endl;
}

\[\]

C - Matching Numbers

题意

给出n,一共有2n个数,从1~2n。问怎么将2n个数排列成n对儿,可以使n对儿数按公比为1的等差数列排列

思路

构造题
尝试可知偶数不可能满足条件,只有奇数n才能满足
对于3
一共有6个数字
1 2 3 4 5 6
我是按这样的排列
1 5
3 4
2 6
对于5
一共有10个数字
1 2 3 4 5 6 7 8 9 10
这样排列
1 8
4 6
2 9
5 7
3 10
即将n个数分成(n + 1) / 2和n / 2两份,然后将n / 2这份插入(n + 1) / 2这份中,然后后n个数按之前操作反过来操作

void solve() {
	int n;
	cin >> n;
	if (n % 2 == 0) cout << "No" << endl;
	else {
		cout << "Yes" << endl;
		for (int i = 1; i <= n / 2 + 1; i ++) {
			cout << i << ' ' << i + n + 1 + n / 2 - 1 << endl;
		}
		for (int i = n / 2 + 2; i <= n; i ++) {
			cout << i << ' ' << i + n / 2 << endl;
		}
	}
}

总结

这场题都很简单,手速场,可惜脑子混的很,浪费了

标签:10,cnt,851,get,int,sum,Codeforces,Div,tt
From: https://www.cnblogs.com/lbzbk/p/17108561.html

相关文章