1 条题解

  • 0
    @ 2026-5-4 12:55:31

    解题思路

    实际上,只进行一次改革就足够了。可以证明,如果只进行一次改革,最优策略总是取最大的 kk,使得数组 aa 中最大的 kk 个数的平均值至少为 xx(即总和 kx\ge kx)。因此解法如下:将数组 aa 降序排序,找到最长的后缀,使得该后缀的和至少为 kxkx


    证明概要

    1. 每次改革后,任意 kk 个最大值的总和不会增加

      • 考虑一次改革,设被选中的元素按降序排列为 bb,改革后这些元素都变为它们的平均值 bb'。可以证明,对于任意 yy,前 yybb 的和大于等于前 yybb' 的和。
      • 固定 kk,将数组分为 kk 个最大值 a1a_1 和其余 nkn-k 个元素 a2a_2。同样地对改革后的数组 aa' 做相同划分。
      • 如果 a1a_1 中被选中的元素个数 a1\ge a'_1 中被选中的元素个数,则 a1a'_1 的总和 a1\le a_1 的总和。
      • 否则,a2a_2 中被选中的元素个数更多,可以证明 a2a'_2 的总和 a2\ge a_2 的总和,由于总和不变量,所以 a1a'_1 的总和 a1\le a_1 的总和。
    2. 一次改革就足够

      • 经过若干次改革后,答案等于某个 kk,使得最大的 kk 个数都 x\ge x。这意味着初始数组中最大的 kk 个数的总和 kx\ge kx。因此,我们只需要一次改革就能使这 kk 个数都达到至少 xx

    C++ 代码实现

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int T;
        cin >> T;
        while (T--) {
            int n, x;
            cin >> n >> x;
            vector<int> a(n);
            for (int i = 0; i < n; ++i) {
                cin >> a[i];
            }
            sort(a.rbegin(), a.rend());  // 降序排序
    
            long long sum = 0;
            int cnt = 0;
            while (cnt < n && sum + a[cnt] >= (cnt + 1) * 1LL * x) {
                sum += a[cnt];
                cnt++;
            }
            cout << cnt << '\n';
        }
        return 0;
    }
    • 1

    信息

    ID
    6784
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者