牛牛的揠苗助长

题意:

传送门

分析:

求最小值问题,可以考虑二分进行求解。
假设用时 (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;
}

推荐题解

原文地址:https://www.cnblogs.com/1024-xzx/p/12897584.html