习题-加减(双指针\前缀和)

习题-加减

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;

long long sum[N], a[N];

signed main(){
    long long n, k; cin >> n >> k;
    for(int i = 1; i < n; ++i){
        cin >> a[i];         
    }
    sort(a, a + n);
    for(int i = 1; i <= n; ++i) sum[i] = sum[i-1] + a[i];
    int l = 1, r = 2;
    long long res = 1;
    while(l <= n && r <= n){
        int mid = l + r >> 1;
        // 计算将区间 [l, r] 内所有元素变为 a[mid] 所需的操作次数
        // a[mid] * (mid - l + 1) - (sum[mid] - sum[l - 1]) 计算将区间 [l, mid] 内元素变为 a[mid] 的操作次数
        // sum[r] - sum[mid] - a[mid] * (r - mid) 计算将区间 [mid + 1, r] 内元素变为 a[mid] 的操作次数
        if(a[mid] * (mid - l + 1) - (sum[mid] - sum[l-1]) + (sum[r] - sum[mid]) - (r - mid) * a[mid] <= k){
            res = max(res, r - l + 1ll);
            ++r;
        }else ++l;
    }
    
    cout << res << endl;
    
    return 0;
}
`
posted @ 2025-03-27 11:21  awei040519  阅读(15)  评论(0)    收藏  举报