1433:【例题1】愤怒的牛

1433:【例题1】愤怒的牛

题解

This is an er‘fen ti.

由题意可得  它是求最小值最大的问题

我们假设:

每两头牛之间的最小距离为 d ,也就是每两头牛之间的距离 >= d ,问题也就是求这个 d 最大是多少

理一理思路

1.对所有的牛舍从小到大排序

2.假设我们把第 i 头牛放在 ai 号牛舍里,那么第 i+1 头牛就要放在 ai+d<=a的ak 牛舍中,由于可能有很多牛舍满足条件,我们选取距离 ai 最近的一个(这是很显然的),然后依次类推,放牛,  放牛,放牛。。。

Ps:解释一下为什么显然:

按照思路,我们应该把cow2放在4号,但是我们就不,我们看看会有什么后果

好啦,显然,我们应该按照思路走:选取距离 a最近的一个

3.由于只需要在开头对数组进行一次sort排序,后面每次判断对每头牛只需要进行一次处理,时间复杂度为O(nlogn)

(注释在代码后面o)

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>

using namespace std;

const int maxn=1e5+1;
int n,c;
int a[maxn];

bool check(int d)    //注释5
{
    int cow=1;
    int now=a[1]+d;
    for(int i=2;i<=n;i++)
    {
        if(a[i]<now) continue;
        cow++;
        now=a[i]+d;
    }
    return cow>=c;
}

int main()
{
    scanf("%d%d",&n,&c);
    for(int i=1;i<=n;i++)
       scanf("%d",&a[i]);     

    sort(a+1,a+n+1);      //注释1

    int l=0,r=a[n]-a[1];  //注释2
    while(l<=r)
    {
        int mid=(l+r)>>1;  //注释3
        if(check(mid)) l=mid+1;   //注释4
        else r=mid-1;
    }

    printf("%d",r);

    return 0;
}

注释

1.输入数据,然后排序一下牛舍

2.初始化一下 L 为0,r 其实就是最后的结果,初始化为第一个牛舍与最后一个牛舍的距离

3.mid为暂定的那个最小距离(也就是博客开始的那个 d ),二分常规操作,(l+r)÷2

4.拿着mid去函数check里看一看(建议结合一下注释5看check的用法)

(1)最小距离定为这个mid,cow可以放下的数目>=规定数目,那么说明这个mid可以再大一点, 更新 l

(2)最小距离定位这个mid,牛舍不能放下约翰的牛喽,那就说明这个距离就要缩小一点啦,更新 r

5.自定义check函数

(1)我们放了第一个cow

(2)下一个cow就要放到>=的牛舍里距离上一个cow最近的牛舍中了

(3)for循环,计算可以放入cow的数目

(4)返回的数值用于注释4

6.不断二分啊二分啊,l 就无限逼近  r ,最后就得到答案啦

原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/10989190.html

时间: 2024-10-06 18:14:08

1433:【例题1】愤怒的牛的相关文章

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

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

原题 传送门 [题目描述] 农夫 John 建造了一座很长的畜栏,它包括N (2 ≤ N ≤ 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 ≤ xi ≤ 1,000,000,000). 但是,John的C (2 ≤ C ≤ N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗.为了不让牛互相伤害.John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢 [输入] 第一行:空格分隔的两个整数N和C: 第二行---

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

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

n<=100000个点在坐标系上,选m个点使点间最小距离最大. 二分模板?? 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 //#include<iostream> 7 using namespace std; 8 9 int n,m; 10 #define maxn

愤怒的牛

1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=1e5+7; 6 int n,m; 7 int l,r,mid; 8 int xx[maxn]; 9 bool check(int u){ 10 int cnt=1;int lft=xx[1]+u; 11 for(int i=2;i<=n;i++){ 12 if(