揠苗助长

有一块长度大小为n的菜园,首先对这块菜园从1到n进行了编号,每一块地分别为1号、2号…n号菜地,然后往每块菜地中都种下了一些水稻,一开始,第i块菜地中的水稻高度均为a[i]个单位。然后我们知道水稻的生长周期都是n天,也就是说每逢n天水稻就会长高一个单位。但是不巧的是整个菜园中每一块菜地的生长周期都错开了,具体来说,第1天的时候第1块菜地中的水稻长高一个单位,第2天的时候第2块菜地中的水稻长高一个单位…第n天的时候第n块菜地中的水稻长高一个单位,接下来第n+1天,又轮到第1块菜地中的水稻长高一个单位以此类推。 每天在水稻进行自然生长之后,可以施展他神奇的魔法,这个魔法可以让任意一块菜地中的水稻长高一个单位,或者让任意一块菜地中的水稻缩短一个单位,当然啦,他也可以不进行任何操作。 看到菜园中的水稻参差不齐十分难受,请问至少在第几天,能够让所有的水稻都长到同一个高度?
输入描述:
第一行是一个正整数n(1≤n≤105),表示有菜园有n块菜地。接下来一行输入n个正整数,表示每块菜地上水稻的高度,水稻的高度1≤a[i]≤109。保证一开始输入时水稻的高度不全都相同(数据保证答案至少为1)。
输出描述:
输出一个正整数表示问题的答案。
示例1
输入
3
1 2 3
输出
1
说明
第一天,第一块菜地的水稻高度增加1,牛牛使用他的魔法使得第三块菜地的水稻再减少1。此时三块水稻的高度为2 2 2.所有水稻的高度均相同。所以答案为1天。

#include<bits/stdc++.h>
#define int long long
char *fs,*ft,buf[1<<20];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read()
{
int x=0,f=1;
char ch=gc();
while(ch<'0'||ch>'9')
{
 if(ch=='-')f=-1;ch=gc();
}
while(ch>='0'&&ch<='9')
{ 
 x=x*10+ch-'0';ch=gc();
}
return x*f;
}
using namespace std;
const int N=1e5+5;
const int inf=0x7fffffff;
const int mod=998244353;
const double eps=1e-6;
long long n,a[N],b[N];
int judge(int x) 
{
 int cnt=x/n;
 int q;
 if(x<n) 
 {
  q=x;
 }
 else 
 {
  q=x%n;
 }
 for(int i=1;i<=n;i++) 
 {
  b[i]=a[i]+cnt;
 }
 for(int i=1;i<=q;i++) 
 {
  b[i]=b[i]+1;
 }
 sort(b+1,b+1+n);
 int mid=n/2;
 int l=mid-1,r=mid+1;
 int cnt1=0,cnt2=0,cnt3=0;
 for(int i=1;i<=n;i++)
 {
  cnt1+=abs(b[i]-b[l]);
  cnt2+=abs(b[i]-b[mid]);
  cnt3+=abs(b[i]-b[r]);
 }
 if(cnt1>x && cnt2>x && cnt3>x) 
 {
  return 0; 
 }
 else 
 {
  return 1;
 }
}
signed main()
{
    cin>>n;
 for(int i=1; i<=n; i++) 
 {
  cin>>a[i];
 }
 long long l=1,r=1e18;
 long long ans;
 if(n==1) return cout<<1,0;
 while(r>=l) 
 {
  int mid=l+r>>1;
  if(judge(mid)) 
  {
   ans=mid;
   r=mid-1;
  } 
  else 
  {
   l=mid+1;
  }
 }
 cout<<ans<<endl;
}
原创文章 326 获赞 309 访问量 3万+

猜你喜欢

转载自blog.csdn.net/huangziguang/article/details/106007022