zoukankan      html  css  js  c++  java
  • POJ 2456 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 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.

    分析:
    类似最大化最小值或者最小化最大值的问题,通常用二分搜索法就可以很好的解决。
    定义:C(d):表示,可以安排牛的位置使得最近的两头牛的距离不小于d

    那么问题就变成了求满足C(d)的最大的d。另外,最近的间距不小于d也可以说成是所有牛的间距都不小于d,因此就有,
    C(d),表示,可以安排牛的位置使得任意的牛的间距都不小于d
    这个问题的判断使用贪心法便可以很好的解决。

    1.对牛舍的位置x进行排序
    2.把第一头牛放入x0的位置
    3.如果第i头牛放入了xj的话,第i+1头牛要放入满足xj+d的最小的xk中,

    对x的排序只需要在最开始的时候进行一次就可以了,每一次判断对每头牛最多进行一次处理。

    代码:

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int N,M;
    int x[100009];
    bool C(int d)
    {
        int last=0;
        for(int i=1; i<M; i++)///看看这个距离能不能放下
        {
            int crt=last+1;
            while(crt<N&&x[crt]-x[last]<d)
                crt++;
            if(crt==N) return false;
            last=crt;
        }
        return true;
    }
    
    void solve()
    {
        sort(x,x+N);
        int lb=0,ub=0x3f3f3f3f;
        while(ub-lb>1)
        {
            int mid=(lb+ub)/2;
            if(C(mid)) lb=mid;
            else ub=mid;
        }
        printf("%d
    ",lb);
    }
    
    int main()
    {
        scanf("%d%d",&N,&M);
        for(int i=0; i<N; i++)
            scanf("%d",&x[i]);
        solve();
        return 0;
    }
    
  • 相关阅读:
    Masterha-manager避免自动关闭的方法
    MHA自动切换流程
    vue 使用keep-alive缓存tab切换组件,保持每个组件滚动条位置
    el-select 输入下拉搜索,匹配不到数据时也保留输入值,同时input获取焦点时保留其value值
    尝试 React16、React-router4 实现根据动态菜单生成按需加载的路由
    vue iscroll5滚动条组件
    vue项目中 axios请求拦截器与取消pending请求功能
    jquery编写的简单日历
    手机访问电脑wampServer本地环境页面
    ajax在ie下返回未定义解决方案
  • 原文地址:https://www.cnblogs.com/cmmdc/p/7207769.html
Copyright © 2011-2022 走看看