对最小差值进行二分即可,注意先把成员按照能力值排序,再进行寻找。
以下为代码:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define INF 1e9
using namespace std;
int n,m,ret;
int a[123456];
bool judge(int num)
{
int temp=0;
for(int i=0;i<n-2;i++){
if(a[i+2]-a[i]<=num){
temp++;
i+=2;
}
}
return temp>=m;
}
int bfind()
{
int l=0,r=ret,mid;
while(l<r){
mid=l+(r-l)/2;
if(judge(mid))r=mid;
else l=mid+1;
}
return l;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
int maxx=0;
int minn=INF;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
maxx=max(maxx,a[i]);
minn=min(minn,a[i]);
}
ret=maxx-minn;
sort(a,a+n);
int ans=bfind();
printf("%d\n",ans);
}
return 0;
}