题意:给一段长度为N数字(不保证有序),将其分成M段,问这M段中,长度最小值最大为多少?(最大化最小值)
思路:二分答案模板
题目链接:POJ2456
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
#define maxn (int)1e5+10
#define INF 1000000000
typedef long long ll;
typedef double db;
int data[maxn],n;
bool judge(int len,int m)
{
int head,tail;
head=0;
for(int i=1;i<m;i++)
{
tail=head+1;
while(tail<n && data[tail]-data[head]<len)
tail++;
if(tail==n)
return false;
head=tail;
}
return true;
}
int solve(int m)
{
int l,r,mid;
l=0;
r=INF;
while(l+1<r)
{
mid=(l+r)/2;
if(judge(mid,m))
l=mid;
else
r=mid;
}
return l; //l一定是答案
}
int main()
{
int m;
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
cin>>data[i];
sort(data,data+n);
cout<<solve(m)<<endl;
}
return 0;
}