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; }