1 条题解

  • 0
    @ 2024-11-27 14:02:48

    因为Monster是懒狗,所以题解也很水。

    首先所有数修改后的范围一定是[numk,num+k][num - k, num + k],所以答案一定小于maxNumminNum+2×kmaxNum - minNum + 2 \times k.

    为了使得极差最小,所以我们要使得较小的数加上kk并使得较大的数减去kk。我们可以将数组排序后逐位枚举每个数,这样对于第ii个数nums[i]nums[i]而言,左侧的数都小于或等于nums[i]nums[i],都加上kk,右侧的数都大于nums[i]nums[i],都减去kk,这样极差一定等于$max(nums[n - 1] - k, nums[i ] + k) - min(nums[0] + k, nums[i + 1] - k)$。

    一次遍历计算即可。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n, k, minNum, maxNum;
        cin >> n >> k;
        vector<int> nums(n);
        for (int i = 0; i < n; i++)
            cin >> nums[i];
        sort(nums.begin(), nums.end());
        minNum = nums[0], maxNum = nums.back();
        int res = maxNum - minNum;
        for (int i = 0; i < n - 1; i++)
        {
            int a = nums[i], b = nums[i + 1];
            res = min(res, max(maxNum - k, a + k) - min(minNum + k, b - k));
        }
        cout << res << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    235
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    (无)
    递交数
    46
    已通过
    18
    上传者