题目描述
Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,...,xN (0<=xi<=1,000,000,000)。
他的C(2<=C<=N)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?
输入输出格式
输入格式:
第1行:两个用空格隔开的数字N和C。
第2~N+1行:每行一个整数,表示每个隔间的坐标。
输出格式:
输出只有一行,即相邻两头牛最大的最近距离。
输入输出样例
输入样例#1: 复制
5 3 1 2 8 4 9
输出样例#1: 复制
3
思路:
二分答案很好想(因为答案随着区间的增加是单调的),主要难点是判定答案是否可行,即代码中的“check”函数。
主要看看注释:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=100005;
int a[N];
int n,c,l,r,m;
bool check()
{
int a1=a[1],sum=1;//首先第一个隔间肯定是要放牛的.
for(int i=1;i<=n;i++)
{
if(a[i]-a1>=m)//如果能放下
{
sum++;;//又放进了一头牛
a1=a[i];更新上一头牛的位置
if(sum==c)//若放完了奶牛
return true;
}
}
return false;//若执行到这里,则无法满足
}
int main()
{
scanf("%d %d",&n,&c);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n);
int l=1,r=10000000;
while(l+1<r)
{
m=(l+r)/2;
if(check()==true)
{
l=m;
}
else
{
r=m;
}
}
printf("%d",l);//一定是左端,而不是mid,至于为什么.....
return 0;
}
好啦,题解就是到这里!!要是专门来学习的,看到这里就可以了,那么,下面是题外话:
另外,,为什么做这一题呢!!这个是关键!
关键,,进击的奶牛!而我正在看进击的巨人!!!
超级好看的有没有!!被哥哥带进坑来啦!!最近第三季正在火热上映!所以正在补第一季第二季,,突然发现,三笠酷又温柔的好帅!!有木有!!哇~~小时候也好好看的~
下面这一张!!更是坚毅的不得了呀!!
下面这一张,,帅的有些过头了吧!
长大之后!!!简直逆天爆表的战斗力啊,大部分时候真的是帅呆了!!立体机动装置用的贼好
哇~~
以上都是废话了.....