文章目录
这是我第一次正式打codeforces,可能一开始比较紧张第一题一直过不了,心态就炸了后来就有点力不从心了,有点摆吧,下一次打一定要认真对待
题目链接
A. Split the Multiset
思路
这个题就是要把n改成n个1,我么们不用管题目上怎么分解的,只需要把每次分解成k-1个1和n-k+1就行
代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int t;
signed main() {
IOS
cin >> t;
while (t--) {
int n, k;
cin >> n >> k;
if (n == 1)
cout << 0 << endl;
else {
int sum = 0;
while (n > k) {
sum++;
n = n - k + 1;
}
cout << sum + 1 << endl;
}
}
return 0;
}
B. Make Majority
题意
这个题意思就是可以让l到r中的数合并成一个其中的数,当区间中1的个数大于0的个数就和并成1,反之合并成0,看最后是否能合并成只有一个1
思路
我们可以把连续的几个零合并成一个,然后看合并后的0和1的个数,如果1多就能合并反之则不能
代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int t;
signed main() {
IOS
cin >> t;
string s;
int a;
while (t--) {
int x = 0, y = 0;
cin >> a >> s;
for (int i = 0; i < a; i++) {
if (s[i] == '0') {
x++;
while (s[i + 1] == '0')
i++;
} else
y++;
}
if (y > x)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
C. Increasing Sequence with Fixed OR
题意
就是要构建一个递增数列并且an|an-1=n
思路
根据我的理解,就是要把原数字的二进制上的数字1换成零,例如23的二进制10111。后续的数字如果要符合条件就要在10111有1的地方换成0.例如10110,10101之类的。这时就要考虑如何将1换掉了。利用二进制的特点,用23不断除以二,判断是否是奇数(因为只有除以2为奇数,二进制上才为1),是奇数的话,就可以减去2n (这样可以直接将二进制上的1变成0)。最后逆序输出
代码
#include <iostream>
#define int long long
using namespace std;
int t, m[1000100];
signed main() {
cin >> t;
while (t--) {
int a;
cin >> a;
if (a == 1 || a == 2) {
cout << 1 << endl << 1 << endl;
continue;
}
int b = a, pow = 1, cnt = 0;
m[0] = a;
while (b) {
if (b % 2 != 0) {
m[++cnt] = a - pow;
}
b /= 2;
pow *= 2;
}
if (m[cnt] == 0) {
cout << 1 << endl << a << endl;
continue;
}
cout << cnt + 1 << endl;
for (int i = cnt; i >= 0; i--)
cout << m[i] << " ";
cout << endl;
}
return 0;
}