您的位置:首页 > 其它

SSL-ZYC 愤怒的牛

2018-02-08 09:00 155 查看
题目大意:

Farmer John建造了一个有N个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,…,xN 。他的C头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?

一道二分的题目。

用z来表示两头牛最多相隔的距离,每次二分出z后,从第一个隔间开始枚举,如果第i个隔间与上一头牛所在的隔间的距离大于等于z,sum就加1。最终判断sum是否大于等于c,若大于等于c,l=z,否则r=z-1。

代码:

#include <cstdio>
#include <algorithm>
using namespace std;

int l,r,z,a[100001],n,m,k,sum,ok,left,right;

int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);  //排序牛棚的位置
l=0;
r=a
;
while (l!=left||r!=right)  //二分
{
left=l;
right=r;
z=(l+r)/2+1;  //求中间数
k=a[1]+z;
sum=1;
ok=0;
for (int i=2;i<=n;i++)  //枚举每一个牛棚
{
if (a[i]>=k)  //如果可以放
{
sum++;  //计数
k=a[i]+z;
if (sum>=m)   //如果每次间隔z的条件是成立的
{
ok=1;
break;  //退出循环
}
}
}
if (ok==1) l=z;
else r=z-1;
}
printf("%d\n",l);  //输出答案
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: