一本通网站 1433:【例题1】愤怒的牛

原题 传送门

【题目描述】

农夫 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。

类似的最大值最小化或者最小化最大值的问题,通常用二分法就可以很好的解决。我们定义:

设C(d)表示可以安排牛的位置,并使得最近的两头牛的距离不小于d。

那么问题就转化为求满足C(d)的最大的d,另外,最近的间距不小于d也可以看成是所以牛的间距不小于d,因此就可以用C(d)表示可以安排牛的位置,并使得任意两头牛的距离不小于d。对于这个问题的判断,使用贪心法便可非常 容易地求解。

1.对牛舍的位置x进行排序;

2.把第一头牛放入x0的牛舍;

3.如果第i头牛放入了xj间牛舍,则第i+1头牛就要放入满足xj+d<=xk的最小的牛舍xk中。

对x的排序只需在最开始是进行一次就可以了,每一次判断对每头牛最多进行一次处理,因此算法的时间复杂度是O(nlogn)。

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int read()
{
    char ch=getchar();
    int a=0,x=1;
    while(ch<‘0‘||ch>‘9‘)
    {
        if(ch==‘-‘) x=-x;
        ch=getchar();
    }
    while(ch>=‘0‘&&ch<=‘9‘)
    {
        a=(a<<3)+(a<<1)+(ch-‘0‘);
        ch=getchar();
    }
    return a*x;
}
int n,m,x[100005];
bool check(int d)
{
    int cow=1;                 //第一个牛舍放牛
    int dis=x[1]+d;            //后面的牛舍要满足大于等于dis才可以放牛
    for(int i=2;i<=n;i++)
    {
        if(x[i]>=dis)
        {
            cow++;              //放进一头牛
            dis=x[i]+d;         //找下一个牛舍应符合的条件
        }
    }
    return cow>=m;              //判断是否够m个
}
int main()
{
    n=read();
    m=read();
    for(int i=1;i<=n;i++) x[i]=read();
    sort(x+1,x+1+n);           //按照牛舍的位置从小到大排序
    int l=0,r=x[n]-x[1];
    while(l<=r)                //二分找答案
    {
        int mid=(l+r)/2;
        if(check(mid)) l=mid+1;//若check为true说明找的这个d偏小,我们要往右区间找
        else r=mid-1;          //否则则偏大,我们往左区间找
    }
    cout<<r;                   //当前r就是最大的d
    return 0;
}

原文地址:https://www.cnblogs.com/xcg123/p/10990458.html

时间: 2024-10-13 22:46:47

一本通网站 1433:【例题1】愤怒的牛的相关文章

1433:【例题1】愤怒的牛

1433:[例题1]愤怒的牛 题解 This is an er'fen ti. 由题意可得  它是求最小值最大的问题 我们假设: 每两头牛之间的最小距离为 d ,也就是每两头牛之间的距离 >= d ,问题也就是求这个 d 最大是多少 理一理思路: 1.对所有的牛舍从小到大排序 2.假设我们把第 i 头牛放在 ai 号牛舍里,那么第 i+1 头牛就要放在 ai+d<=ak 的ak 牛舍中,由于可能有很多牛舍满足条件,我们选取距离 ai 最近的一个(这是很显然的),然后依次类推,放牛,  放牛,放

BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )

最小最大...又是经典的二分答案做法.. -------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; ++i ) #defin

bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛

1734: [Usaco2005 feb]Aggressive cows 愤怒的牛 Description 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 &l

1734: [Usaco2005 feb]Aggressive cows 愤怒的牛

1734: [Usaco2005 feb]Aggressive cows 愤怒的牛 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 217  Solved: 175[Submit][Status][Discuss] Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a st

一本通网站基础篇完结纪念

一本通网站基础篇题目终于完结,发篇随笔纪念下这一伟大时刻的到来. 一本通网站基础篇题目所有AC代码(点此进入) 说明:此篇所有代码均为网站提交通过的代码且基本都是本人亲写.(当然部分题目也可能参考了网站其他文章.请教了其他老师),如发现代码有错,烦请告知,感谢! 特别明谢:之江学院石老师.江西省丰城中学熊雪芬老师.成都石室中学文老师(也是此网站管理)等给了我很大帮助,还有我的学员督促和鼓励. 友情链接:  (进来了不防帮忙点下上面“我要自学网”图标链接,此链接为我学习网站的推广,换点积分,非常感

一本通网站 1424:【例题3】喷水装置 及 贪心总结

原题   传送门 [题目描述] 长 LL 米,宽 WW 米的草坪里装有 nn 个浇灌喷头.每个喷头都装在草坪中心线上(离两边各 W2W2 米).我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围. 请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头? [输入] 输入包含若干组测试数据. 第一行一个整数 TT 表示数据组数: 每组数据的第一行是整数 nn.LL 和 WW: 接下来的 nn 行,每行包含两个整数,给出一个喷头的位置和浇灌半径(上面的示意图是样例输入第一组数据

bzoj1734 愤怒的牛

Description 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 an

BZOJ1734: [Usaco2005 feb]Aggressive cows 愤怒的牛 二分查找

Description 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 an

Aggressive cows 愤怒的牛

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 agg