• poj 3258"River Hopscotch"(二分搜索+最大化最小值问题)


    传送门

    https://www.cnblogs.com/violet-acmer/p/9793209.html

    题意:

      有 N 块岩石,从中去掉任意 M 块后,求相邻两块岩石最小距离最大是多少?

    题解:

      二分答案(假设答案为res)

      定义 l = 0 , r = L ;

      mid = (l+r)/2 ;

      判断当前答案 mid 至少需要去除多少块岩石,如果去除的岩石个数 > M,说明当前答案mid > res,r=mid;反之,说明当前答案 mid <= res , l =mid;

    AC代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 const int maxn=5e4+10;
     6 
     7 int L,N,M;
     8 int dist[maxn];
     9 
    10 bool Check(int mid)
    11 {
    12     int res=0;
    13     int pre=0;
    14     for(int i=1;i <= N;++i)
    15     {
    16         if(dist[i]-dist[pre] < mid)
    17             res++;
    18         else
    19             pre=i;
    20     }
    21     return res <= M ? true:false;
    22 }
    23 int Solve()
    24 {
    25     sort(dist+1,dist+N+1);
    26     int l=0,r=L+1;
    27     while(r-l > 1)
    28     {
    29         int mid=l+((r-l)>>1);
    30         if(Check(mid))
    31             l=mid;
    32         else
    33             r=mid;
    34     }
    35     return l;
    36 }
    37 int main()
    38 {
    39     scanf("%d%d%d",&L,&N,&M);
    40     dist[0]=0;
    41     for(int i=1;i <= N;++i)
    42         scanf("%d",dist+i);
    43     printf("%d
    ",Solve());
    44     return 0;
    45 }
    View Code
  • 相关阅读:
    准备工作
    小黄衫感言
    2021软件工程总结
    4 20210412-1 原型设计作业
    2021软工-软件案例分析
    202103226-1 编程作业
    《构建之法》——读后感
    2021软件工程-第一周作业01准备工作
    Arthas笔记
    自定义 Web 容器
  • 原文地址:https://www.cnblogs.com/violet-acmer/p/10154126.html
Copyright © 2020-2023  润新知