[ABC361C]Make Them Narrow

题目大意

给定一个长度为N的序列A,删除其中的K个元素,最小化剩余元素中最大值减去最小值

错误思路一

把A序列排序,每次删除一个最大值,删除一个最小值,比如说我们要删除两个元素,就把最大的值和最小的值删除了,这样剩下的最大值减去最小值就是最小的,这个贪心是错的
举个例子:
1 2 5 19 20
删除最大值和最小值后,剩下的是最大值是19,最小值是2,他两相减是17
但是显然更优的是,删除前两个1和2,这样最大的是20,最小的是5,他两相减是15,这个更小
所以这个贪心是错误的

正确思路

错误思路给了我启发,大胆猜想,删除的K个元素肯定是连续的元素,有可能是一个连续的两段,也有可能是连续的两段
用反证法来看这个问题,假设这K个元素不连续,比如x,y,z,我们删除了x和z,不删除y的话,这是不优秀的,因为删除了x,不能删除了y,y比x更大,会造成答案更大,所以删除肯定是连续的

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
int a[maxn];
int n,k,ans;
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    ans=a[n]-a[1];
    for(int i=0;i<=k;i++){
        ans=min(ans,a[n-k+i]-a[i+1]);
    }
    cout<<ans;
    return 0;
}

posted @ 2024-07-10 20:14  xinyimama  阅读(32)  评论(0)    收藏  举报