zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    POJ 2661
    POJ 2643
    POJ 2656
    POJ 2612
    POJ 2636
    搭建WordPress个人博客
    【个人笔记】ximo早期发的脱壳教程——手脱UPX壳
    2.1【欢乐向】攻防世界新手逆向刷题被虐哭日常记录
    吾爱破解培训第一课个人笔记
    第五章 计算机组成
  • 原文地址:https://www.cnblogs.com/AaronChang/p/12169382.html
Copyright © 2011-2022 走看看