2.9 Codeforces Round #851 (Div. 2)

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的位置就是答案

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)减去这一半即可,体现在数字上

1257这个数
get(1257) = 15
那需要减去的数为8
在1257数字位上减去这个数字,首先减去个位的7,剩1,再去减十位,剩0,这对儿数字为1240,8

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;
		}
	}
}

总结

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

posted @ 2023-02-10 13:07  nobodyL  阅读(70)  评论(0)    收藏  举报