首页 > 代码库 > poj 3258 River Hopscotch 二分

poj 3258 River Hopscotch 二分

 1 /**
 2 大意:给定n个点,删除其中的m个点,其中两点之间距离最小的最大值
 3 思路: 二分最小值的最大值---〉t,若有距离小于t,则可以将前面的节点删除;若节点大于t,则继续往下查看
 4           若删除的节点大于m,说明t,过于大,需要减小;若删除的节点小于m说明t过于小了,t需要增大
 5 **/
 6 #include <iostream>
 7 #include <algorithm>
 8 using namespace std;
 9 long long c[50050];
10 int main()
11 {
12     long long l,n,m;
13     cin>>l>>n>>m;
14     for(int i=1;i<=n;i++)
15         cin>>c[i];
16     c[0] =0;
17     c[n+1] = l;
18     n = n+2;
19     sort(c,c+n);
20     long long minn =c[1]-c[0];
21     for(int i=2;i<n;i++){
22         minn = min(minn,c[i]-c[i-1]);
23     }
24     long long low = minn,high = l;
25     long long mid;
26     while(low<=high){
27         mid = (high+low)>>1;
28         int cnt =0;
29         int s=0,e=1;//start 开始节点,end,最后节点
30         while(e<n){
31             if(c[e]-c[s]>=mid)
32                 s =e,e++;
33             else
34                 e++,cnt++;
35         }
36         if(cnt>m)
37             high = mid-1;
38         else
39             low = mid +1;
40     }
41     cout<<high<<endl;
42     return 0;
43 }