题目描述 给定一个正整数 n ,表示一个国家的城市数量。再给定一列整数 a 1 , a 2 ,⋯, a n ,表示每个城市生产或者消费物资的数量,正数表示生产数量,负数表示消费数量。输入数据保证生产总量和消费总量是相等的,即 a 1 + a 2 +⋯+ a n =0 。 这些物资可以从一个城市搬运到另一个城市,一次搬运必须在两个编号相邻的城市间进行,若搬运一个单位数量的物资到一个相邻的城市,将产生一个单位的工作量。请设计一个方案,使得所有物资都从生产城市搬运至消费城市,且每个消费城市需要的物资数量都能得到满足,且搬运的总工作量达到最小。 输入 第一行:单个整数表示 n 。 第二行: n 个整数表示 a 1 , a 2 ,⋯, a n 。 单个整数:表示最优运输方案产生的最少工作总量。 样例输入输出 输入#1 复制 4 -10 10 20 -20 输出#1 复制 30 提示 对于 30% 的数据, 1≤n≤10 ; 对于 60% 的数据, 1≤n≤100 ; 对于 100% 的数据, 1≤n≤100000 , −100000≤ a i ≤100000 ;c++代码
时间: 2024-02-15 18:02:33 浏览: 108
以下是使用 C++ 实现的贪心算法代码:
```c++
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 100010;
int a[MAXN], b[MAXN], c[MAXN];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = a[i];
}
sort(b + 1, b + n + 1); // 对生产物资排序
int l = 1, r = n;
for (int i = 1; i <= n; i++) {
if (b[i] > 0) // 生产物资
c[l++] = b[i];
else // 消费物资
c[r--] = b[i];
}
long long ans = 0;
for (int i = 1; i < n; i++) {
ans += abs(c[i] - c[i + 1]); // 计算工作量
}
cout << ans << endl;
return 0;
}
```
该代码先将生产物资按照数量从大到小排序,然后从左右两端分别依次将物资搬运到相邻的城市,直到所有物资都被搬运到消费城市。最后计算所有搬运产生的工作量之和,输出答案。
阅读全文