c语言写代码。这里有n根有一定长度的棍子。您的任务是修改棒,使每个棒具有相同的长度。 你可以延长或缩短每根棍子。两个操作都花费r,其中r是新长度和原始长度之间的差值。 最低总成本是多少? 输入 第一个输入行包含一个整数n:stick的数量。 然后有n个整数:pl,p2,……pn木的长度 输出 打印一个整数:最小总成本。 限制条件 1≤n≤2*10**5 1≤pi<10**9
时间: 2024-02-25 17:53:54 浏览: 93
有源码C语言输出一个字符串的长度.cpp
好的,这是一道比较典型的贪心算法问题。我们可以先计算出所有棍子的平均长度,然后对于每根棍子,将其长度缩短或延长到平均长度,记录下总的成本。下面是一个C语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 200005
int a[MAXN];
int cmp(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
int main() {
int n;
scanf("%d", &n);
long long sum = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
sum += a[i];
}
int avg = sum / n;
for (int i = 0; i < n; i++) {
a[i] -= avg;
}
qsort(a, n, sizeof(int), cmp);
long long cost = 0;
for (int i = 0, j = n-1; i <= j; i++, j--) {
cost += abs(a[i]) + abs(a[j]);
}
printf("%lld\n", cost);
return 0;
}
```
这个代码的思路是先计算出所有棍子的平均长度,然后将每根棍子的长度减去平均长度,这样就可以将问题转化为将所有数变为0的最小代价。然后我们将这些数从小到大排序,从两端开始遍历,对于每个数,将其变为0的代价为其绝对值,最后将所有代价相加就是最小总成本了。
阅读全文