poj 3258 River Hopscotch 二分

 /**
大意:给定n个点,删除其中的m个点,其中两点之间距离最小的最大值
思路: 二分最小值的最大值---〉t,若有距离小于t,则可以将前面的节点删除;若节点大于t,则继续往下查看
若删除的节点大于m,说明t,过于大,需要减小;若删除的节点小于m说明t过于小了,t需要增大
**/
#include <iostream>
#include <algorithm>
using namespace std;
long long c[];
int main()
{
long long l,n,m;
cin>>l>>n>>m;
for(int i=;i<=n;i++)
cin>>c[i];
c[] =;
c[n+] = l;
n = n+;
sort(c,c+n);
long long minn =c[]-c[];
for(int i=;i<n;i++){
minn = min(minn,c[i]-c[i-]);
}
long long low = minn,high = l;
long long mid;
while(low<=high){
mid = (high+low)>>;
int cnt =;
int s=,e=;//start 开始节点,end,最后节点
while(e<n){
if(c[e]-c[s]>=mid)
s =e,e++;
else
e++,cnt++;
}
if(cnt>m)
high = mid-;
else
low = mid +;
}
cout<<high<<endl;
return ;
}
上一篇:HDU 3507 PrintArticle (单调队列优化)


下一篇:ReSharper详解Index0