1.首先二分group的差值,然后判断在差值x下能否分成每组数量大于等于K的要求。
2.利用dp check,dp[i]表示考虑1-i使得1-dp[i]全部划分合法的最大值,即离i最近的位置P,且1-P能够划分合法。如果从dp[i-k]+1到i差值小于等于x,则说明dp[i-k]-i可以划分为一组,所以dp[i]=i。最后判断dp[n]=n即可。
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define maxn 300010
typedef long long ll;
const ll mod=(1e9)+7;
int n,k;
int dp[maxn],v[maxn];
bool check(ll x){
int pos=0;
for(int i=k;i<=n;i++){
int prp=dp[i-k];
if(v[i]-v[prp+1]<=x){
pos=i;
}
dp[i]=pos;
}
return dp[n]==n;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)scanf("%d",&v[i]);
sort(v+1,v+1+n);
int L=0,R=v[n]-v[1],P;
while(L<=R){
int mid=(L+R)/2;
if(check(mid)){
P=mid;R=mid-1;
}
else{
L=mid+1;
}
}
printf("%d\n",P);
return 0;
}