题目链接: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 }