总结
省流掉分了。可以说是底层玩家真是艰苦度日啊。不知道什么时候才能上1600。在1400和1500徘徊了6场比赛了,还是没有上到1600。这次更是掉大分。比赛地址:https://codeforces.com/contest/2029。
补题和反思
A:Set
做法:
比赛的时候没细想,就直接用二分过了。实际上不用这么麻烦,我们先找大第一个
不满足k * x <= R的位置。也就是x = floor(R / k)。如果 x 小于 L那么答案就是0,如果x >= L,那么答案就是x - L + 1。
代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main() {
int t;
cin >> t;
while (t -- ) {
long long l, r, k;
cin >> l >> r >> k;
// long long ql = l - 1, qr = r;
// while (ql < qr) {
// long long mid = ql + qr + 1 >> 1;
// if (r / mid >= k) {
// ql = mid;
// } else {
// qr = mid - 1;
// }
// }
// 二分
long long ql = r / k;
cout << max(0ll, ql - l + 1) << endl;
}
return 0;
}
B:Replacement
做法:
这个题目需要发现一些性质。首先只要0或则1的个数不小于0,那么一定可以继续操作,也就是一定存在相邻的01进行操作。其次每次操作 i 会让0和1的个数都减少一个,然后增加一个r[i]。最终我们只需要从头到尾遍历 r 字符串。看每次是否能够操作,不能就返回no。
这个题目在吃了三发罚时,因为让num1初始化等于1。
代码:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
int t;
cin >> t;
while (t -- ) {
int n;
cin >> n;
string s, r;
cin >> s >> r;
int num0 = 0, num1 = 0;
for (int i = 0; i < n; i ++ ) {
if (s[i] == '0') {
num0 ++ ;
}
else {
num1 ++ ;
}
}
bool flag = true;
for (int i = 0; i < n - 1; i ++ ) {
if (num0 <= 0 || num1 <= 0) {
flag = false;
break;
}
num0 -= 1; num1 -= 1;
if (r[i] == '0') {
num0 ++ ;
}
else {
num1 ++ ;
}
}
if (flag) {
cout << "YES" << endl;
}
else {
cout << "NO"

最低0.47元/天 解锁文章
918

被折叠的 条评论
为什么被折叠?



