牛牛的揠苗助长(二分&贪心)
牛牛的揠苗助长(二分&贪心)
假设水稻先不长,显然是数组中某一个数
相等是最优的。依次类推
因此若不进行任何操作,数组变成数组
有:
然后将数组排序,显然当
为奇数时,肯定是选取
当为偶数时也是选取
,而不是选取
这里做个证明:
因为花费的公式为: 
对于前者:将代入:
                     
对于后者:将代入: 
                
显然前者花费小。所以无论为奇数还是偶数,
都是最优解。
因为当时能使所有数相等,那么
都可以通过使那个要增加的数减1来保持相等。所以接下来用对答案不断二分就可以了。
时间复杂度:
AC代码:
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10;
typedef long long ll;
ll a[N],n,ans,b[N];
bool jg(ll x){
    for(int i=1;i<=n;i++)
        b[i]=a[i]+x/n+(i<=x%n);
    sort(b+1,b+n+1);
    ll res=0;
    for(int i=1;i<=n;i++) res+=abs(b[i]-b[(n+1)>>1]);
    return  res<=x; 
}
int main(){
    scanf("%lld",&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(jg(mid)) r=mid-1,ans=mid;
        else l=mid+1; 
    }
    printf("%lld\n",ans);
    return 0;
} 
 查看6道真题和解析
查看6道真题和解析