zoukankan      html  css  js  c++  java
  • 牛牛的揠苗助长

    题意:

    传送门

    分析:

    求最小值问题,可以考虑二分进行求解。
    假设用时 (t) ,那么在 (t) 时间内,每块水稻会增加相应的高度(不考虑认为因素时)。当我们进行认为调整,使得所有的水稻高度一致,必然会选择一个基准点,该块的水稻的高度不会变,其它的水稻高度向它靠近。那么,我们只要求出此过程中需要人为调整的天数,和时间 (t) 比较,如果调整所需的天数比 (t) 小,则说明时间 (t) 还可以更优。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e5+5;
    typedef long long ll;
    int a[N],b[N],n;
    bool check(ll m)
    {//m天各自生长后的高度
        for(int i=1;i<=n;i++)
        {
            b[i]=a[i]+m/n;
            if(m%n>=i) b[i]++;
        }
        sort(b+1,b+1+n);
        ll p=b[(n+1)/2],res=0;//取中位数为基准
        for(int i=1;i<=n;i++)
            res+=abs(p-b[i]);
        return res<=m;
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        ll l=1,r=1e14;
        while(l<=r)
        {
            ll mid=(l+r)>>1;
            if(check(mid)) r=mid-1;
            else l=mid+1;
        }
        printf("%lld
    ",l);
        return 0;
    }
    
    

    推荐题解

  • 相关阅读:
    Scala与Mongodb实践1-----mongodbCRUD
    Scala实践14
    Scala实践13
    Scala实践12
    Scala实践11
    Scala实践10
    Scala实践9
    Scala实践6
    Scala实践8
    Oracle Object Type
  • 原文地址:https://www.cnblogs.com/1024-xzx/p/12897584.html
Copyright © 2011-2022 走看看