您的位置:首页 > 其它

2016夏季练习——二分

2016-07-15 12:20 246 查看
来源:POJ2456

二分水题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN = 100000+10;
int n,m;
int a[MAXN];
bool judge(int d){
int cnt=1;
int len=a[0]+d;
for(int i=0;i<n;i++){
if(a[i]>=len){
len=a[i]+d;
cnt++;
}
}
if(cnt>=m) return 1;
return 0;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",a+i);
}
sort(a,a+n);
int left=0;
int right=a[n-1]-a[0];
int mid;
int ans;
while(left<=right) {
mid=(left+right)/2;
if(judge(mid)){
left=mid+1;
ans=mid;
}
else{
right=mid-1;
}
// cout<<left<<" "<<mid<<" "<<right<<endl;
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: