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;
} 
京公网安备 11010502036488号