1. 程式人生 > >2017暑假 二分

2017暑假 二分

hid spl spa play 但是 ... max while bool

  • 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暑假 二分