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\n",Solve());
44     return 0;
45 }
View Code

 

posted @ 2018-12-21 10:15  HHHyacinth  阅读(142)  评论(0编辑  收藏  举报