c语言写代码。这里有n根有一定长度的棍子。您的任务是修改棒,使每个棒具有相同的长度。 你可以延长或缩短每根棍子。两个操作都花费r,其中r是新长度和原始长度之间的差值。 最低总成本是多少? 输入 第一个输入行包含一个整数n:stick的数量。 然后有n个整数:pl,p2,……pn木的长度 输出 打印一个整数:最小总成本。 限制条件 1≤n≤2*10的五次方,1≤pi<10的9次方
时间: 2024-02-25 19:53:59 浏览: 297
非常抱歉,我之前的回答有误,感谢您的指正。下面是一个新的代码实现:
```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;
long long cost = 0;
for (int i = 0; i < n; i++) {
cost += abs(a[i] - avg);
}
printf("%lld\n", cost);
return 0;
}
```
这个代码的思路是先计算出所有棍子的平均长度,然后将每根棍子的长度减去平均长度,这样就可以将问题转化为将所有数变为0的最小代价。然后我们遍历每个数,将其变为平均长度的代价为其与平均长度的差的绝对值,最后将所有代价相加就是最小总成本了。
相关问题
c语言写代码。这里有n根有一定长度的棍子。您的任务是修改棒,使每个棒具有相同的长度。 你可以延长或缩短每根棍子。两个操作都花费r,其中r是新长度和原始长度之间的差值。 最低总成本是多少? 输入 第一个输入行包含一个整数n:stick的数量。 然后有n个整数:pl,p2,……pn木的长度 输出 打印一个整数:最小总成本。 限制条件 1≤n≤2*10**5 1≤pi<10**9
好的,这是一道比较典型的贪心算法问题。我们可以先计算出所有棍子的平均长度,然后对于每根棍子,将其长度缩短或延长到平均长度,记录下总的成本。下面是一个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的代价为其绝对值,最后将所有代价相加就是最小总成本了。
阅读全文