好斗的奶牛 C++ 的二分做法

Hello,everybody!
又见面了,我是Aqin!!!

废话少说,先看今天的题目
好斗的奶牛
好斗的奶牛 C++ 的二分做法_第1张图片
输入格式
第1行2个数N和C(2<=C<=N)。

接下来N行,每行一个数表示第i个槽的位置xi。

输出格式
距离最近两头奶牛间的距离的最大值。

数据限制:

50%数据保证n<=100

70%数据保证n<=10000

100%数据保证n<=100000
输入样例
5 3
1
2
8
4
9

输出样例
3

样例提示:

John将他的3头奶牛放入坐标为1、4、9这3个槽类,最近的两头奶牛间的距离为3.

题目就是这样,我恨不得把奶牛杀了吃掉,不过言归正传,我们来分析题目:

很容易想到,此题要用二分的思想,相信各位Oler一定都知道二分怎么做吧,这里不多解释,若不会二分,我建议先去学习一下二分在来做这道题目。

好了
上代码(有详解)

#include//万能头文件(省了很多行)
using namespace std;
const int maxn = 100005;//定义常量maxn,方便的很
int n,c;
int x[maxn];
bool check(int m)//check函数,用来判断当前答案是否可行
{
	int cnt = 1,k = 1;
//cnt记录匹配到槽的奶牛数,k记录上一个匹配到奶牛的槽的编号
	for(int i = 2;i <= n;i++)
	if(x[i] - x[k] >= m)
	{
		cnt++;
		k=i;
	}
	if(cnt >= c)  return 1;
	return 0;
}
int main()
{
	cin >> n >> c;
	for(int i = 1;i <= n;i++)//读入数据
	cin >> x[i];
	sort(x+1,x+1+n);//先用sort进行排序
	//不得不说,sort真好用!!!
	int A = 0,B = 1000000000,ans = 0;
	//以下为重点!!!
	for(int i=0;i<35;i++)//二分找答案
	{
		int mid = (A+B)/2;
		if(check(mid))  ans = mid,A = mid+1;
		else  B = mid - 1;
	}
    cout << ans;//输出结果
    return 0;
}

好啦今天的分享就到这里,我们有机会再见!!!

你可能感兴趣的:(好斗的奶牛 C++ 的二分做法)