莲子正在研究分子的运动。
每个分子都有一个速度,约定正方向为正,负方向为负。分子的数量极多,速度又并不一致,看上去杂乱无章。于是莲子希望调整部分分子的速度,使得最终分子们看上去整齐。
莲子给定了 nnn 个整数 a1,a2,⋯ana_1,a_2,\cdots a_na1,a2,⋯an,描述每个分子。现在她可以进行至多 mmm 次操作(也可以一次也不进行),每次操作可以执行以下两条之一:
现在莲子希望需要最小化最终序列的极差(最大值减去最小值的差)。请求出最小的极差。
例如,对于序列 a={5,1,4}a=\{5,1,4\}a={5,1,4},可以进行如下几次操作:
这两次操作后得到的序列为 {1,4,4}\{1,4,4\}{1,4,4}。最大值减去最小值的差为 ∣4−1∣=3|4-1|=3∣4−1∣=3。
当然,这种操作方式得到的极差并非最小。最优策略是,先将最大值 a1=5a_1=5a1=5 变成目前的最小值 111,再把此时的最大值 a3=4a_3=4a3=4 变成目前的最小值 111。此时序列为 {1,1,1}\{1,1,1\}{1,1,1},得到的极差 ∣1−1∣=0|1-1|=0∣1−1∣=0 是所有策略中最小的。
3 2
5 1 4
0
8 0
1 2 3 4 5 6 7 8
7
8 3
1 5 5 5 6 6 9 10
4
样例 111:{5,1,4}→{1,1,4}→{1,1,1}\{5,1,4\}\to\{1,1,4\}\to\{1,1,1\}{5,1,4}→{1,1,4}→{1,1,1},极差为 000。
样例 222:{1,2,3,4,5,6,7,8}\{1,2,3,4,5,6,7,8\}{1,2,3,4,5,6,7,8},什么也做不了,极差为 777。
样例 333:{1,5,5,5,6,6,9,10}→{10,5,5,5,6,6,9,10}→{5,5,5,5,6,6,9,10}→{5,5,5,5,6,6,9,5}\{1,5,5,5,6,6,9,10\}\to\{10,5,5,5,6,6,9,10\}\to\{5,5,5,5,6,6,9,10\}\to\{5,5,5,5,6,6,9,5\}{1,5,5,5,6,6,9,10}→{10,5,5,5,6,6,9,10}→{5,5,5,5,6,6,9,10}→{5,5,5,5,6,6,9,5},极差为 444。
对于全部数据,保证 1≤n≤1051\le n \le 10^51≤n≤105,0≤m≤1090\le m\le10^90≤m≤109,∣ai∣≤109|a_i|\le 10^9∣ai∣≤109。
#include
#include
using namespace std;
const int N = 1e5 + 10;
int num[N], n, m;int main() {cin >> n >> m;for(int i = 0; i < n; i++ ) {cin >> num[i];}sort(num, num + n, [](int x, int y){return x < y;});int res = num[n - 1] - num[0];if(n > m) {for(int i = 0; i <= m / 2; i++ ) {int k = n - 1 - (m - i * 2);res = min(res, num[k] - num[i]);}for(int i = 0; i <= m/2 ; i++ ) {int k = (m - i * 2);res = min(res, num[n - 1 - i] - num[k]);}} else {res = 0;}cout << res << endl;return 0;
}
上一篇:时不与我是什么意思
下一篇:请写出有关语言描写的好段,