Refact.ai Match 1 (Codeforces Round 985)补题

总结

省流掉分了。可以说是底层玩家真是艰苦度日啊。不知道什么时候才能上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" 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值