莲子正在研究分子的运动。
每个分子都有一个速度,约定正方向为正,负方向为负。分子的数量极多,速度又并不一致,看上去杂乱无章。于是莲子希望调整部分分子的速度,使得最终分子们看上去整齐。
莲子给定了 n n n 个整数 a 1 , a 2 , ⋯ a n a_1,a_2,\cdots a_n a1,a2,⋯an,描述每个分子。现在她可以进行至多 m m m 次操作(也可以一次也不进行),每次操作可以执行以下两条之一:
现在莲子希望需要最小化最终序列的极差(最大值减去最小值的差)。请求出最小的极差。
例如,对于序列 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。
当然,这种操作方式得到的极差并非最小。最优策略是,先将最大值 a 1 = 5 a_1=5 a1=5 变成目前的最小值 1 1 1,再把此时的最大值 a 3 = 4 a_3=4 a3=4 变成目前的最小值 1 1 1。此时序列为 { 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
样例
1
1
1:
{
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},极差为
0
0
0。
样例
2
2
2:
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
}
\{1,2,3,4,5,6,7,8\}
{1,2,3,4,5,6,7,8},什么也做不了,极差为
7
7
7。
样例
3
3
3:
{
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},极差为
4
4
4。
对于全部数据,保证 1 ≤ n ≤ 1 0 5 1\le n \le 10^5 1≤n≤105, 0 ≤ m ≤ 1 0 9 0\le m\le10^9 0≤m≤109, ∣ a i ∣ ≤ 1 0 9 |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;
}