满分代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=500020;
int dp[N];//表示前i个人分一组时最后一个人的下标
//分组的要求为大于等于m
int a[N];//每个人的不开心值
int n,m;
int main(){
memset(dp,0,sizeof(dp));
scanf("%d%d",&n,&m);
int l,r;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
l=0,r=1e9;
while(l<r){
int mid=(l+r)/2;
for(int i=m;i<=n;i++){//dp[i-m]代表上一分组
if(a[i]-a[dp[i-m]+1]<=mid){
dp[i]=i;//前i个人分组的最后一个是i
}else{
dp[i]=dp[i-1];
}
}
if(dp[n]==n){
r=mid;
}else{
l=mid+1;
}
}
cout<<l<<endl;
return 0;
}