【POJ 3258】 River Hopscotch (2分)
【POJ 3258】 River Hopscotch (二分)
【POJ 3258】 River Hopscotch
一窝牛要过河 河宽l 河中有n个许多石块 每个对应与牛所在的岸边有个距离 现在想要去掉m个石块后最小距离最大 问怎么去
二分最小值最大化
代码如下:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int p[50002]; int n,m; bool can(int x) { int i,j,cnt = m; for(i = 0,j = 1; i <= n; i = j, ++j)//枚举石块 { if(p[n+1]-p[i] < x) return false;//石块距离对岸<x 肯定不行 while(p[j]-p[i] < x)//找出第一块保证最小值>=x的石块 { if(!cnt) return false;//不能再去石块时 不可行 ++j; cnt--; } } return true; } int main() { int mid,l,r,i,ans; while(~scanf("%d %d %d",&r,&n,&m)) { p[0] = 0; for(i = 1; i <= n; ++i) scanf("%d",&p[i]); l = p[n+1] = r;//初始下界 sort(p,p+n+2); for(i = 1; i <= n+1; ++i) l = min(l,p[i]-p[i-1]);//找最低下界 while(l <= r) { mid = (l+r)>>1; if(can(mid)) { ans = mid; l = mid+1; } else r = mid-1; } printf("%d\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。