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