题目大意:
给你一个 \(n\) 和 \(k\) ,再给你一个长度为 \(N\) 的序列 \(A\) ,
从 \(A\) 中任意选择 \(K\) 个元素并将其删除,然后按原来的顺序将剩余的元素连接起来,形成一个新的序列 \(B\) ,然后求这个序列的极差。
解题思路
错误解法
一开始我想到了贪心:把 \(A\) 数组排个序,然后把开头结尾依此去掉即可。
但是好比这个数据:
1 3 3 9 11
贪心可以得到:3 3 9
但是实际上应该是这样:1 3 3
正确解法
我们可以用一直类似滑动窗口的方式解决这个问题:
#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;
}
标签:Them,int,Make,序列,Narrow,贪心
From: https://www.cnblogs.com/ACyming/p/18361924