这一天他抢到了n个订单,这些订单的目的地都在宝鸡钢管路上(可以看做在一条坐标轴上), 第i个订单的目的地的位置是ai。帮1v7w找一下,他最少走多长的距离就能够把外卖全部送完?这里他可以从任意一点开始送外卖, 并从任意一点结束送外卖。 输入 第一-行包含一个整数n(2 < n < 100)。 第二行包含n个整数,第i个整数为 a;(0≤a;≤1000)。 输出 输出1v7w把外卖送完所需要的最少的走动距离。 输入样例1图 输出样例1 4 |7 2379 输入样例2圍 输出样例2 8 |8 31415926。用C++写出代码
时间: 2024-02-13 22:59:48 浏览: 73
一个高效的定时器分析及设计-综合文档
题目描述可能存在一些排版问题,不过我们可以大致理解其意思。这是一道求解最短路径问题,可以使用贪心或动态规划思想解决。这里给出动态规划的实现代码:
```c++
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
int n;
int a[105];
int f[105][105];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
memset(f, INF, sizeof f);
f[1][0] = 0;
for (int i = 2; i <= n; i++) {
for (int j = 1; j < i; j++) {
for (int k = 0; k < j; k++) {
f[i][j] = min(f[i][j], f[j][k] + abs(a[i] - a[j]) + abs(a[k] - a[i]));
}
}
}
int res = INF;
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
res = min(res, f[i][j] + abs(a[n] - a[i]) + abs(a[j] - a[n]));
}
}
cout << res << endl;
return 0;
}
```
这里的 `f[i][j]` 表示前 `i` 个订单,最后一次送到的位置为第 `j` 个订单时的最小花费。动态转移方程为:
$$f[i][j] = \min_{k=0}^{j-1}\{f[j][k] + |a[i]-a[j]| + |a[k]-a[i]|\}$$
最终答案为:
$$\min_{i=1}^{n-1}\min_{j=0}^{i-1}\{f[i][j] + |a[n]-a[i]| + |a[j]-a[n]|\}$$
这里用的是暴力枚举方式,因此时间复杂度为 $O(n^3)$,可以通过本题。
阅读全文