F Make Them Narrow
题意就是有n个数,现在让你减去k个,让剩下数的最大值减去最小值最小;
首先,排序是一定要的。既然减去了k个数,那剩下还有n-k个数,这就形成了一个区间,而区间的个数就是k+1个,我们可以通过模拟删除除区间内的数之外的数,来枚举每个值。//为什么是k+1个区间自己算一下就知道了
例如
5 2
3 1 5 4 9
排序:1,3,4,5,9 区间大小5-2=3;
区间 [1,3,4]:最大值为 4,最小值为 1,差值为 3
区间 [3,4,5]:最大值为 5,最小值为 3,差值为 2(最小差值)
区间 [4,5,9]:最大值为 9,最小值为 4,差值为 5
点击查看代码
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using lll = unsigned long long;
typedef pair<int, int> PII;
const int N = 1e6 + 5;
const ll M = 1e12;
ll prime[N / 10];
bool isPrime[N];
ll cnt[N];
ll a[N];
int main()
{
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
sort(a + 1, a + n + 1);
ll ans = LONG_LONG_MAX;
for (int i = 1; i <= k+1; i++)
{
ans = min(ans, a[n - k + i - 1] - a[i]);//n-k+i-1是第i个区间的最大值,推一下就知道边界为什么是这个了
}
cout << ans << endl;
return 0;
}
浙公网安备 33010602011771号