Input
* Line 1: Two space-separated integers: N and C * Lines 2..N+1: Line i+1 contains an integer stall location, xiOutput
* Line 1: One integer: the largest minimum distanceSample Input
5 3 1 2 8 4 9Sample Output
3 题意: 先输入两数,表示牛舍数与要放下多少头牛,后面给出牛舍的位置(牛舍在一条直线),求出放完牛后有牛的牛舍之间最小距离中的最大值 分析: 一定数量的牛舍,一个位置只能放一头牛,那么要放入的牛数量越多,牛舍之间距离相对越小,所以可以用二分法做,我用judge函数判断x距离下能否放下这C头牛,二分循环找出可以放下这C头牛的最大的两舍之间的最小距离。 吐槽: 本题我提交了好多次,最后发下超时的原因竟然是cin的输入速度太慢,换成scanf就AC了 #include<iostream> #include<stdio.h> #include<string> #include<algorithm> #include<string.h> using namespace std; int m,n,a[100002]; bool judge(int x) { int g=a[0],f=1; for(int i=0;i<n;i++) { if(a[i]-g>=x) { f=f+1;//符合距离要求,放下一头牛 g=a[i]; if(f>=m){return true;}访完了,可以 } } return false; } int main() { int k,max=-1,ans=0,beg,end,mid; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { scanf("%d",&a[i]); if(a[i]>max){max=a[i];} } sort(a,a+n); end=max-a[0];beg=1; ans=1; while(beg<=end)//逐步找出符合要求的最小距离,在诸多都可以放下C头牛的最小距离中找出最大值 { mid=(end+beg)/2; if(judge(mid)) { ans=mid; beg=mid+1; } else { end=mid-1; } } cout<<ans; }