二分搜索实例 ,先排序,算出每一个石头的间隔,从l和最小间隔中二分找答案
#include <iostream>
#include <algorithm>
using namespace std;
int a[50010],n,m;
bool cmp(int a,int b){
return a<b;
}
int test(int D)
{ int i,t=0,k=0;
for (i=0;i<n+1;i++)
{
t+=a[i];
if (t<D) k++;
else t=0;
}
if (k>m) return 0;
else return 1;
}
int main()
{
int l,mid=0;
cin>>l>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
a[0]=0;
a[n+1]=l;
sort(a,a+n+1,cmp);
int h=a[1];
for(int i=0;i<=n;i++){
a[i]=a[i+1]-a[i];
if(a[i]<h)h=a[i];
}
while(l-h>1){
mid=(l+h)/2;
if(test(mid))h=mid;
else l=mid;
}
if(test(h+1))h++;
cout<<h;
return 0;
}
原文地址:http://www.cnblogs.com/Mr-Xu-JH/p/3855193.html