Make Them Narrow

题目大意:

给你一个 nnkk ,再给你一个长度为 NN 的序列 AA
AA 中任意选择 KK 个元素并将其删除,然后按原来的顺序将剩余的元素连接起来,形成一个新的序列 BB ,然后求这个序列的极差。

解题思路

错误解法

一开始我想到了贪心:把 AA 数组排个序,然后把开头结尾依此去掉即可。
但是好比这个数据:
1 3 3 9 11
贪心可以得到:3 3 9
但是实际上应该是这样:1 3 3

正确解法

我们可以用一直类似滑动窗口的方式解决这个问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, k;
int a[N], ans = INT_MAX;
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + 1 + n); // 排序
for (int i = 1; i <= n - (n - k) /*n - k 指的是留下的数*/ - 1 /*去掉当前这一个数字*/; i++)
{
ans = min(ans, a[i + (n - k) - 1 /*同上*/] - a[i]);
// 因为排序,所以小的在上,大的在下,计算极差直接用最后一个减掉第一个即可
}
cout << ans;
return 0;
}