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 }
窝貌似落下了很多题。。。
emm...假装不知道。。。 7.30
以上是关于2017暑假 二分的主要内容,如果未能解决你的问题,请参考以下文章