C 种水稻

给你一组数,每次选一个数+1或者-1,多少次之后能够使得所有数相同---仔细想一下,要想所有数都相同的次数最小,那么这个数和其他所有数差值绝对和最小,那么这个数就是排序之后的中位数(反证法就可以证明),结论:排序之后的b[size/2]为最终相等的数。
这道题加了条件:就是第i天会加1;
答案天数上面具有单调性,我们直接二分答案
这题没AC,因为右边界写小了……

#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define N 100005
ll a[N];
ll b[N];
int main()
{
    ll n;cin>>n;ll mx=0,mi=1e9;
    ll ans=0;
    for(int i=0;i<n;++i) {
        cin>>a[i];
        mx=max(mx,a[i]);
        mi=min(mi,a[i]);
    }
    ll l=1,r=1e18;
    while(l<=r){

        ll mid=l+(r-l)/2;
        ll dd=mid/n;ll mm=mid%n;
        for(int i=0;i<n;++i){
            b[i]=a[i]+dd;
            if(i<mm) b[i]+=1;
            //cout<<b[i]<<" ";
        }
        //cout<<endl;
        sort(b,b+n);
        ll dif=0;ll bmid=b[n/2];
        for(int i=0;i<n;++i){
            dif+=abs(b[i]-bmid);
        }
        if(mid>=dif){
            r=mid-1;
            ans=mid;
        }else{
            l=mid+1;
        }
    }

   cout<<ans;
}