Codeforces Round 924 (Div. 2)

在这里插入图片描述

Codeforces Round 924 (Div. 2)

Codeforces Round 924 (Div. 2)

A. Rectangle Cutting

题意:给出a*b的矩形,沿着其中一个边恰好一分为二后可以组成一个新的矩形
思路:判断其中一个边是否可以被2整除以及二分后是否等于另一个边即可
AC code:

void solve() {
    int a, b; cin >> a >> b;
    if (a % 2 == 0 && a / 2 != b || b % 2 == 0 && b / 2 != a) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }
}

B. Equalize

题意:给出长度为n的整数数组a,将1到n的数分别加到数组元素中,数组众数最大是多少
思路:

  • 去重,因为每个数一定会加上一个不同的数,原本重复的元素一定不会贡献比1更大的答案
  • 排序后找到区间极值小于n的最长连续子序列,该长度就是答案(二分or双指针均可)

AC code:

  • 双指针
void solve() {
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i ++) 
        cin >> a[i];
    sort(a.begin(), a.end());
    a.erase(unique(a.begin(), a.end()), a.end());
    int sz = a.size();
    int l = 0, r = 0, ans = 1;
    while (l <= r) {
        while (a[r] - a[l] < n && r < sz) r ++;
        ans = max(ans, r - l);
        l ++;
    }
    cout << ans << endl;
}
  • 二分
bool check(const vector<int> &a, int x, int len) {
    for (int i = 0; i <= len - x; i ++) 
        if (a[i + x - 1] - a[i] < n) return true;
    return false;
}
 
void solve() {
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i ++) 
        cin >> a[i];
    sort(a.begin(), a.end());
    a.erase(unique(a.begin(), a.end()), a.end());
    int sz = a.size();
    int l = 1, r = sz;
    while (l < r) {
        int mid = l + r + 1 >> 1;
        if(check(a, mid, sz)) l = mid;
        else r = mid - 1;
    }
    cout << l << endl;
}

C. Physical Education Lesson

题意:额

  • 有长度为n的一排队伍,队伍的序号有个标准值k,每2*k-2重置一次序号,每段为(1,2…k,k-1,k-2…2)这样的;

  • 现在当前队尾序号为x,有多少种可能的k

思路:

  • 将每组2k-2看成一段上坡一段下坡,分答案在上坡和下坡的情况

    • 上坡:首先最后一段一定是1~x为结尾,而前面我们假设有Y段(2k-2),总长度为n,所以可以得到:
      Y * (2 * k - 2) + x = n,即(n - x) % (2
      k-2) == 0

    • 下坡:同理我们可以得到:
      Y * (2 * k - 2) - x + 2 = n,即(n + x - 2) % (2*k-2) == 0

  • 然后根据情况枚举因子即可,注意枚举过程可能会出现重复,所以用set来统计答案方便去重

AC code:

void solve() {
    cin >> n >> x;
    set<int> st;
    int fr = n - x;//上坡
    for (int i = 1; i <= fr / i; i ++) {
        if (fr % i == 0) {
            if (i % 2 == 0) {
                int k = (i + 2) / 2;
                if (k >= x) st.insert(k);
            }
            int j = fr / i + 2;
            if (j % 2 == 0) {
                int k = j / 2;
                if (k >= x) st.insert(k);
            }
        }
    }
    int ba = n + x - 2;//下坡
    for (int i = 1; i <= ba / i; i ++) {
        if (ba % i == 0) {
            if (i % 2 == 0) {
                int k = (i + 2) / 2;
                if (k >= x) st.insert(k);
            }
            int j = ba / i + 2;
            if (j % 2 == 0) {
                int k = j / 2;
                if (k >= x) st.insert(k);
            }
        }
    }
    cout << st.size() << endl;
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值