牛客练习赛63 补题
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; }