欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

#1#农夫和他的奶牛(poj2456 二分)

程序员文章站 2022-03-24 11:37:49
...

**

#1#农夫和他的奶牛(poj2456 二分)

**

(题外话:这是菜鸡F的第一篇博客!作为一个身为计算机专业学子却羞耻的是个纯粹的编程小白的F也是有一个伟大的理想和一颗坚持奋斗的心的!今天开始写博客,记录自己多多少少的成长。三十年河东三十年河西,莫欺少年穷。那么我们一起加油吧!)

//
有n个牛栏,选m个放进牛,相当于一条线段上有 n 个点,选取 m 个点,
使得相邻点之间的最小距离值最大
思路:贪心+二分
二分枚举相邻两牛的间距,判断大于等于此间距下能否放进所有的牛。
//

这道题一开始没有读懂题。后来看了别人的题目分析才明白a[n]数组的用处是储存牛栏隔间的编号,相隔距离即编号的差值。所以首先需要对隔间编号进行排序。而后利用二分法依次缩小寻找最小距离的最大值的范围。最后找出答案。

这是学了二分法以后的第一次应用。在此附上二分法的核心代码:

while(l<=r)      //l为最小值,r为最大值
{
	mid=l+(r-l)/2;
	if(judge(mid))l=mid+1;
	else r=mid-1;
} 

二分查找法的时间复杂度为:O(log2n)

以下为该题完整代码

#include<iostream>
#include<cstdio> 
#include<cstring>
#include<algorithm>
using namespace std;
int const MAXN = 1000000;
int n,cow,a[MAXN];
bool judge(int dis){                 //检验该距离是否能放入所有牛
	int cc=a[0],count=1;             //放入第一头牛
	for(int j = 1;j < n;j++){
		if(a[j]-cc >= dis) {
			count++;                 //如果下一个隔间与上一个隔间的间距满足要求 则放入一头牛
			cc=a[j];
		}
		if(count >= cow) return true;
	}
	return false;
}
void distance(){                  //二分查找最小距离的最大值
	int l=1,r=a[n-1]-a[0];
	while(l<r){
		int mid=l+(r-l)/2;
		if(judge(mid)) l=mid+1;
		else r=mid-1;
	}
	cout<<r<<endl;
}
int main(){
	while(cin>>n>>cow){
		for(int i=0;i<n;i++)
			cin>>a[i];
		sort(a,a+n);
		distance();
	}
	return 0;
}
相关标签: 小白的学习之路