ABC361-C题解

背景

昨天打比赛的时候查了中考分,心快停跳了。

题意

\(n\) 个数字中删除 \(k\) 个数字,问剩下的数字中极差的最小值。

分析

首先把这 \(n\) 个数字排序,然后问题就可以转化为求这 \(n\) 个数字中所有长度为 \(n-k\) 的连续子段的极差的最小值。

采用尺取法,可以从 \(1\) 开始枚举左端点。设当前左端点为 \(i\),则右端点为 \(n-k+i-1\)。然后中途更新 \(ans\) 值即可。

Code

#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#include<ext/pb_ds/trie_policy.hpp>
#include<ext/pb_ds/priority_queue.hpp>
#define int long long
using namespace std;
using namespace  __gnu_pbds;
//gp_hash_table<string,int>mp2;
//__gnu_pbds::priority_queue<int,less<int>,pairing_heap_tag> q;
inline int read()
{
	int w=1,s=0;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
	return w*s;
}
const int mod=998244353;
const int maxn=1e6+10;
int n,k;
int a[maxn],ans=1e9+7;
signed main()
{
//	freopen("xxx.in","r",stdin);
//	freopen("xxx.out","w",stdout);
	cin>>n>>k;
	k=n-k;
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n-k+1;i++)
	{
		ans=min(ans,a[i+k-1]-a[i]);
	}
	cout<<ans;
	return 0;
}
posted @ 2024-07-17 16:58  Redamancy_Lydic  阅读(5)  评论(0编辑  收藏  举报