题目链接:[传智杯 #5 初赛] D-莲子的物理热力学 - 洛谷
知识点:枚举
思路:分别试将i个数变为最大值,m-i个数变为最小值。每次变化都有两种方式:
1.先将最小值变为最大值
2.先将最大值变为最小值
分别求出每个i对应的极差,取其中的最小值
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 100005;
ll a[MAXN];
int main()
{
ll n,m;
ll num;
ll ans=0X7f7f7f7f7f;
cin>>n>>m;
for(int i=0;i<n;++i) cin>>a[i];
sort(a,a+n);
if(m>=n-1) ans=0;
else for(int i=0;i<=m;++i)
{
if(n+2*i-m-1<=n-1) num=a[n+2*i-m-1]-a[i];
else num=a[n-1]-a[i];
if(num<ans&&num>=0) ans=num;
if(m>=2*i) num=a[n-i-1]-a[m-2*i];
else num=a[n-i-1]-a[0];
if(num<ans&&num>0) ans=num;
}
cout<<ans;
return 0;
}