poj 3258 二分
题意:一条长为len(1<len<1,000,000,000)的河中,有n(1<n<50,000)块石头,移除m块,使具有最近距离的两块石头之间的距离最大。
分析:二分,上界为len,下界为当前最近的石头的间距。
对于二分的题目
若求的是最大值,while(low <= high) ... if(check())... low=mid+1; else high=mid-1;
若求的是最小值,while(low < high) ... if(check())... high=mid; else low=mid+1;
答案均为 high
const int N = 50005; int a[N]; int len, n, m; int low, high; bool check(int d){ int s = a[0], cnt = 0; FOR(i, 1, n){ if(a[i]-s < d) cnt++; else s = a[i]; } if(cnt > m) return false; return true; } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); #endif scanf("%d%d%d", &len, &n, &m); FOE(i, 1, n) scanf("%d", &a[i]); a[0]=0; a[n+1]=len; n += 2; sort(a, a+n); low = -1; high = len; FOR(i, 1, n) checkmin(low, a[i]-a[i-1]); while(low <= high){ int mid = (low + high) / 2; if( check(mid) ) low = mid+1; else high = mid-1; } printf("%d\n", high); return 0; }