揠苗助长

有一块长度大小为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;
}
### C语言实现“揠苗助长”示例程序 为了模拟“揠苗助长”的过程,可以通过数组表示每块稻田的高度,并利用循环来调整高度直到它们达到一致的状态。以下是基于参考引用的内容以及逻辑设计的一个完整的C语言程序。 #### 程序说明 该程序的核心在于找到使所有数值相等所需的最小操作次数。这通常涉及寻找中位数并逐步调整其他值以接近它。具体算法如下: 1. 输入一组整数代表初始状态下的稻田高度。 2. 计算这些数值的中位数作为目标高度。 3. 对于每一个低于或高于此中位数的值,分别累加所需的操作次数。 4. 输出总的操作次数。 下面是具体的代码实现: ```c #include <stdio.h> #include <stdlib> // 函数声明 void sortArray(int *arr, int n); int findMedian(int *arr, int n); int main() { int n; printf("请输入稻田数量: "); scanf("%d", &n); // 获取稻田的数量 int heights[n]; printf("请输入各稻田的高度:\n"); for (int i = 0; i < n; ++i) { scanf("%d", &heights[i]); // 输入每个稻田的高度 } // 排序数组以便查找中位数 sortArray(heights, n); int median = findMedian(heights, n); long totalOperations = 0; // 统计总的调整次数 for (int i = 0; i < n; ++i) { if (heights[i] != median) { totalOperations += abs(median - heights[i]); } } printf("使所有稻田高度一致所需的最小操作次数为:%ld\n", totalOperations / 2); return 0; } // 冒泡排序函数用于排列数组元素 void sortArray(int *arr, int n){ for (int i = 0; i < n-1; ++i){ for (int j = 0; j < n-i-1; ++j){ if (arr[j] > arr[j+1]){ int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } // 查找中位数 int findMedian(int *arr, int n){ if(n % 2 == 0){ return (arr[n/2 - 1] + arr[n/2]) / 2; }else{ return arr[n/2]; } } ``` 上述代码实现了从输入到处理再到输出整个流程的功能[^1]。其中`sortArray()`负责对数据进行排序,而`findMedian()`则返回中位数值。最终的结果除以2是因为每次操作可以同时改变两个位置上的值。 #### 关键点解释 - **冒泡排序**:虽然不是最高效的排序方法,但对于理解如何比较和交换元素很有帮助。 - **绝对差异累积**:通过计算每个元素与中位数之间的差距之和得出最少需要多少次增减才能让所有的稻田高度变得一样高[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【执珪】瑕瑜·夕环玦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值