2017暑假 二分

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017暑假 二分相关的知识,希望对你有一定的参考价值。

  • POJ 3258 - River Hopscotch

题意:奶牛弹跳力大PK~河上有若干石头,奶牛从一端跳到对岸即可。Farmer John觉得石头太多了,距离太近了没难度,要你帮他去掉m个石头,使得奶牛需要跳跃的最小距离能多大就多大(MAX)。

思路:没错,就是最大化最小值,没错,就是二分~

二分对象:最小距离d。

check方式:cnt一下距离小于d的石头,<=m即可。

ps:去掉一个石头之后下一个石头的前驱为当前石头的前驱,要记得更新但是不要直接改数据啊zz。

代码如下: 

技术分享
 1 #include <algorithm>
 2 #include <iostream>
 3 #include <stdio.h>
 4 
 5 using namespace std;
 6 
 7 long long l,r[50005];
 8 int n,m;
 9 
10 bool c(long long d)
11 {
12     int cnt = 0;
13     for(int i = 1, j = 0; i <= n+1; i++)//pre j;
14     {
15         if((r[i] - r[j]) < d) cnt++;
16         else j = i;
17     }
18     return cnt <= m;
19 }
20 
21 int main()
22 {
23     scanf("%I64d%d%d",&l,&n,&m);
24     long long lb = 1e9, ub = l;
25     r[n+1] = l;
26     r[0] = 0;
27     for(int i = 1; i <= n; i++) scanf("%I64d", &r[i]);
28     sort(r+1, r+n+1);
29     for(int i = 1; i <= n+1; i++) lb = min(lb, (r[i] - r[i-1]));
30 
31     while(ub-lb > 1)//此时mid>lb;
32     {
33         long long mid = (lb+ub)/2;
34         if(c(mid)) lb = mid;
35         else ub = mid;
36     }
37 
38     printf("%I64d\n", lb);
39 
40     return 0;
41 }
View Code

 

窝貌似落下了很多题。。。

emm...假装不知道。。。                                                                                                                           7.30

 


以上是关于2017暑假 二分的主要内容,如果未能解决你的问题,请参考以下文章

2017暑假集训前总结和规划

2021年SWPUACM暑假集训day1二分算法

2019暑假集训8.22(problem2.dinner)(二分)

暑假集训 || 二分+三分

暑假D14 [SCOI2010]连续攻击游戏(二分图)

暑假自学JAVA Web心得