POJ3258 River Hopscotch(二分最大化最小值)

题目链接:http://poj.org/problem?id=3258

题意:给n个石头,起点和终点也是两个石头,去掉这石头中的m个,使得石头间距的最小值最大。

思路:二分石头间的最短距离,每次贪心地check一下是否满足条件即可,具体看代码。

AC代码:

 1 #include<iostream>
 2 #include<stack>
 3 #include<vector>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 vector<int> rock;
 8 int L,N,M; 
 9 bool check(int x){
10     int cur = 0;//上一个石头的下表 
11     int sum = 0;
12     for(int i = 1;i<rock.size();i++){
13         if(rock[i]-rock[cur]<x){//如果距离小于x,则需要去掉 
14             sum++;//统计一下 
15         }
16         else{
17             cur = i;
18         }
19     }
20     return sum<=M;
21 }
22 int main(){
23     while(cin>>L>>N>>M){
24         rock.clear() ;
25         rock.push_back(0); 
26         for(int i = 0;i<N;i++){
27             int t;cin>>t;
28             rock.push_back(t); 
29         }
30         rock.push_back(L); 
31         sort(rock.begin(),rock.end());
32         int l = 0,r = L*2,mid; //因为最大距离可能是L,所以区间右端点需要开到L*2 
33         while(l<r){//二分最小距离 
34             mid = (l+r+1)>>1;
35             if(check(mid)){
36                 l = mid ;
37             }
38             else{
39                 r = mid - 1;
40             }
41         }
42         cout<<l<<endl;
43     }
44     return 0;
45 }
原文地址:https://www.cnblogs.com/AaronChang/p/12169382.html