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;
}
12-29 20:57