题意:
一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L。
河中有n块石;
输入的每块石头的距离是到起点的距离。
问现在要移除m块石头(S和E除外),每次移除的是与当前最短距离相关联的石头,要求移除m块石头后,使得那时的最短距离尽可能大,输出那个最短距离。
做法:
和上一道题目的做法是一样的都是二分。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[100100];
int n,m;
int sw(int mid)
{int s,num,i;s=0;num=0;for(i=1;i<n+2;i++){if((s=s+a[i]-a[i-1])<=mid){num++;}else{s=0;}}if(num>m)return 0;else return 1;
}
int main()
{int l,r,i,mid,end;cin>>end>>n>>m;r=end;l=end;a[0]=0;a[n+1]=end;for(i=1;i<=n+1;i++){if(i<n+1)scanf("%d",&a[i]);if(l>a[i]-a[i-1])l=a[i]-a[i-1];}mid=(l+r)/2;sort(a,a+(n+2));while(l<=r){if(sw(mid))l=mid+1;else r=mid-1;mid=(l+r)/2;}cout<<l<<endl;return 0;
}