ACM寒假集训——二分

Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,…,xN (0 <= xi <= 1,000,000,000).

His C (2 <= C <= N) cows don’t like this barn layout and become aggressive towards each other once put into a stall. To prevent the cows from hurting each other, FJ want to assign the cows to the stalls, such that the minimum distance between any two of them is as large as possible. What is the largest minimum distance?
Input

  • Line 1: Two space-separated integers: N and C

  • Lines 2…N+1: Line i+1 contains an integer stall location, xi
    Output

  • Line 1: One integer: the largest minimum distance
    Sample Input
    5 3
    1
    2
    8
    4
    9
    Sample Output
    3
    Hint
    OUTPUT DETAILS:

FJ can put his 3 cows in the stalls at positions 1, 4 and 8, resulting in a minimum distance of 3.

Huge input data,scanf is recommended.

题目思路:二分的思想就是对半分、平均分,一直对半分到区间为0结束,并且二分法是必须对有序的集合进行。
二分法的重要公式:int mid=(l+r)/2;
二分法的重点在于判断区间,以此题为例:先放一头牛,把他放在a[1]的位置,并用一个变量pos标记每次放牛的位置。如果a[i位置减pos大于等于一半区间,则证明此位置可以放牛,此时更新pos的位置和放牛的数目。
最后判定牛的数目是否大于原先给定的牛的数目,如果大于返回一个真值用于if判断,如果此时满足条件则更新下标,以判定下一个位置是不是满足,不满足更新上标,以判定上一个位置是不是满足,更新时由于上下标的当前位置已经判定过所以可以不必再判定。而且可以根据题目获取你需要得到的上下标的值。

ac代码:
#include<stdio.h>
#include
#include
using namespace std;
const int N=1e5+10;
int a[N];
int m,n;
int judge(int x)
{
int num=1;
int pos=a[1];
for(int i=2;i<=n;i++)
{
if(a[i]-pos>=x)
{
pos=a[i];num++;
}
}
return num>=m;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
int l=0,r=1e9;
int ans=0;
while(l<=r)
{
int mid=(l+r)/2;
if(judge(mid))
{
l=mid+1;
ans=mid;
}
else
{
r=mid-1;
}
}
printf("%d\n",ans);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值