Educational Codeforces Round 185 (Rated for Div. 2)

A. Maximum Neighborhood

void solve(){
    int n;
    cin >> n;
    if(n == 1) {
        cout << 1 << endl;
        return ;
    }
    if(n == 2){
        cout << 9 << endl;
        return ;
    }

    int t1 = 4 * n * n - n - 4;
    int t2 = 5 * n * n - 5 * n - 5;
    cout << max(t1, t2) << endl;
}

B. Addition on a Segment

这样想,如果每次都是选一个区间,那么n次操作后,数组 a 的和就是 n。一旦计算得到数组 a 的和大于 n,则说明存在至少一个操作选的区间是大于1的,这一次操作能取到的最大值取决于 a 数组总和减去 n,并且最长不会超过数组 b 不为0的元素的长度;也就是说,取一个最长区间,总有n-1次操作能达到题目的要求。

void solve(){
    int n;
    cin >> n;
    int sum = 0, x;
    int len = 0;
    for(int i = 0; i < n; ++i){
        cin >> x;
        if(x) len++;
        sum += x;
    }
    cout << min(sum - n + 1, len) << endl;
}

C. Quotient and Remainder

image

根据题目可推出上述不等式 ,为了尽可能得最大操作次数,我们将  (k - ri) / (ri + 1) 从大到小遍历,在b数组中搜索,一旦发现有比这个数小于等于的元素,说明符合题目要求,删除b数组的这个元素,ans++,直至 ri 遍历结束,得到答案。

void solve(){
    int n, k;
    cin >> n >> k;
    vector<int> q, r(n + 1);
    for(int i = 1; i <= n; ++i){
        int x;
        cin >> x;
        q.emplace_back(x);
    }
    for(int i = 1; i <= n; ++i) cin >> r[i];
    vector<int> a;
    for(int i = 1; i <= n; ++i) a.emplace_back((k - r[i]) / (r[i] + 1));
    sort(q.begin(), q.end());
    sort(a.begin(), a.end());
    int i = 0, j = 0;
    int ans = 0;
    while(i < n && j < n){
        if(q[i] > a[j]) j++;
        else{
            ans++;
            i++;
            j++;
        }
        
    }
    cout << ans << endl;
}

 

posted @ 2025-12-05 00:31  菜鸡の编程日常  阅读(8)  评论(0)    收藏  举报