Make Them Narrow

题目大意:

给你一个 \(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;
}
posted @   ACyming  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示