1 条题解
-
0
因为Monster是懒狗,所以题解也很水。首先所有数修改后的范围一定是,所以答案一定小于.
为了使得极差最小,所以我们要使得较小的数加上并使得较大的数减去。我们可以将数组排序后逐位枚举每个数,这样对于第个数而言,左侧的数都小于或等于,都加上,右侧的数都大于,都减去,这样极差一定等于$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
- 上传者