悬关
查看原帖
悬关
637788
kimi0705楼主2023/7/29 17:59
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int K = 1e3 + 10;
const int L = 1e4 + 10;
const int M = 1e5 + 10;
const int N = 1e6 + 10;
int t, n, k, ans;
int arr[2 * M], sum[2 * M], Sum, Point;
signed main() {
    //  freopen (".\\data\\in.txt", "r", stdin);
    //  freopen (".\\data\\out.txt", "w", stdout);
    ios::sync_with_stdio (false);
    cin.tie (0);
    cout.tie (0);
    cin >> t;
    while (t--) {
        ans = INT_MAX;
        cin >> n >> k;
        for (int i = 1; i <= n; i++) cin >> arr[i];
        if (n == 1) {
            cout << max (0LL, arr[1] - k) << '\n';
            continue;
        }
        sort (arr + 1, arr + n + 1); // 排序
        sum[n] = arr[n];
        for (int i = n - 1; i; i--) sum[i] = sum[i + 1] + arr[i]; // 后缀和
        Sum = sum[1], Point = 1;
        for (int i = 0; i <= ans; i++) { // 枚举将 a[1] 减 i 次
            while (Sum - (sum[Point + 1] - (arr[1] - i) * (n - Point) ) <= k && Point <= n) Point++; // 找到第一个可以的地方
            if (Point != 1)
                ans = min (ans, i + n - Point + 1);
            Sum--;
        }
        cout << ans << '\n';
    }
    return 0;
}
2023/7/29 17:59
加载中...