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;
}
}
}
总结
这场题都很简单,手速场,可惜脑子混的很,浪费了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步