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。
代码:
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; }