题意:
某人搭了一间有N间牛舍的小屋,c支牛,每个牛距离都不想太紧,问牛之间能达到得最小距离!!一看最大值的最小值问题,大多数就要使用二分算法!
思路:
采用二分查找的思想,对中间值进行寻找,类似于课堂上讲的那个移动石头的题目!
代码:
#include<iostream>
#include<string>
#include<stdio.h>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100005
int a[N];
int main()
{
//freopen("1.txt","r",stdin);
int n,c,i,mid,lp,rp;
scanf("%d %d",&n,&c);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
lp=0;rp=2000000000;
while(lp<rp)//注意是>号,而不用等于,注意这个细节!
{
int cnt=1,j=1; //记录最小时放的牛
mid=(lp+rp)/2;//首先假设mid为最大值的最小值!
for(i=2;i<=n;i++)
{
if(a[i]-a[j]>mid) //细节处理
{cnt++;j=i;}
}
if(cnt<c)
rp=mid;
else
lp=mid+1;
}
printf("%d",rp);
return 0;
}
心得:
典型的二分查找,还是理解有点不透彻!!!!