poj 3258 【二分搜素】
阿新 • • 發佈:2018-12-14
題意:牛要到河對岸,在與河岸垂直的一條線上,河中有N塊石頭,給定河岸寬度L,以及每一塊石頭離牛所在河岸的距離,現在去掉M塊石頭,要求去掉M塊石頭後,剩下的石頭之間以及石頭與河岸的最小距離的最大值。
二分搜素
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int Max = 5e4+5; int L,N,M; int dis[Max]; /* 要求去掉M塊石頭後,剩下的石頭之 間以及石頭與河岸的最小距離的最大值。 */ int cmp(int a,int b) { return a<b; } int Bsearch(int l,int r,int k) { int mid,last,cnt; while(l<=r) { mid=(l+r)>>1; last = cnt = 0; for(int i=1;i<=N+1;i++) if(mid>=dis[i]-dis[last]) cnt++; else last = i; if(cnt>k) r = mid-1; else l = mid+1; } return l; } int main() { cin>>L>>N>>M; dis[0]=0; dis[N+1]=L; for(int i=1;i<=N;i++) cin>>dis[i]; sort(dis+1,dis+N+1,cmp); int ans = Bsearch(0,L,M); cout<<ans<<endl; return 0; }