二分
前几天接触了二分,所谓二分,顾名思义,就是把一组数据每次都从中间去取,设一个key值,每次去比较,之后移动最左面的值或者右面的值,再去比较,直到求出自己需要的值。
我看过一篇大佬的文章,感觉受益匪浅:传送门
这里放上一道很基础的题。
愤怒的牛
【题目描述】
农夫 John 建造了一座很长的畜栏,它包括N (2 ≤ N ≤ 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 ≤ xi ≤ 1,000,000,000). 但是,John的C (2 ≤ C ≤ N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢
【输入】
第一行:空格分隔的两个整数N和C;
第二行---第N+1行:i+1行指出了xi的位置。
【输出】
一个整数,最大的最小值。
【输入样例】
5 3
1 2 8 4 9
【输出样例】
3
【提示】
把牛放在1,4,8这样最小距离是3
AC代码:
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#define MAX 100010
using namespace std;
int a[MAX];
int main()
{
int n,c;
scanf("%d %d",&n, &c);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
int le=0,ri=a[n];
while(le<=ri)
{
int mid=(le+ri)>>1;
int ans=1;
int k=mid+a[1];
for(int i=2; i<=n; i++)
{
if(a[i]>=k)
{
ans++;
k=mid+a[i];
}
}
if(ans>=c)
{
le=mid+1;
}
else
{
ri=mid-1;
}
}
printf("%d\n",le-1);
return 0;
}