题目链接:信息学奥赛一本通T1433-愤怒的牛 - C语言网 (dotcpp.com)
题目大意
给出N间在一条线上的屋子,要求我们计算让牛在最大化离最小值的距离
思路
1.由于这道题要计算固定的范围内求出最大的距离,所以这类思维需要用到二分的最大化最小值。
2.运用最大化最小值,需要找到中间值,再让左右端点与中间值靠近进行比较,从而确定牛所在的位置,最后计算出结果
坑点
1.需要用到bool类型函数,(有的时候一些二分题可以枚举暴力通过,但这道题不同),所以我认为这是一个坑点
2.需要考虑到边界问题(这个有点难处理)
代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[100005];
int n,m;
bool w(int q)//定义一个bool类型判断真假
{
int j=a[0],niu=1;//从第a[0]开始
for(int i=0;i<n;i++)
{
if(a[i]-j>=q)//对每个牛距离进行判断是否满足最大距离最最小值
{
j=a[i];
niu++;//牛的距离++
if(niu>=m)
{
return true;//说明已经找到答案
}
}
}
return false;//没有找到
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);//将每个牛舍进行排序,以便进行比较
int l=0,r=a[n-1]-a[0];//定义左右端点 ,l=0表示从0的位置开始,r表示右边除了第0的数
while(l+1<r)//
{
int mid=(l+r)/2;
if(w(mid))//表示找到的牛舍位置(true)
{
l=mid;
}
else
{
r=mid;
}
}
cout<<l<<endl;
return 0;
}
总结
对于我而言,这个二分类的题还是很有难度的,特别是遇到边界问题