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