1 条题解
-
1
思路
先排序,然后假设数据为,只会有两种方式:
方式一:
最快的两个作为划回的船,两个来回运走两个最慢的,好处是最慢的和次慢的组合消除掉次慢的时间,坏处是往回划的有一半是次快的。时间:
方式二:
只有最快的作为划回的船,两个来回运走两个最慢的,好处是往回划的时间是最优的,坏处是往对岸划的次慢的时间也走了。时间: 综合两种情况,只需要把数据划分为大于个这四种情况,大于的时候比较方式一和二取最小值,的时候单独讨论即可
标程
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; // 选择排序函数,对数组进行排序 void sort(int *pe, int n) { int i, j; int temp; for (i = 0; i < n; i++) { for (j = n - 1; j > i; j--) { if (pe[j] < pe[j - 1]) { temp = pe[j]; pe[j] = pe[j - 1]; pe[j - 1] = temp; } } } } int main() { int t, n; int pe[1000]; int i; int sum; scanf("%d", &t); while (t--) { sum = 0; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d", &pe[i]); } sort(pe, n); while (n > 0) { if (n == 1) { sum += pe[0]; n = 0; } else if (n == 2) { sum += pe[1]; n = 0; } else if (n == 3) { sum += (pe[1] + pe[0] + pe[2]); n = 0; } else { int a1 = pe[0] + pe[1] * 2 + pe[n - 1]; int a2 = pe[0] * 2 + pe[n - 1] + pe[n - 2]; sum += (a1 < a2)? a1 : a2; n -= 2; } } printf("%d\n", sum); } return 0; }
- 1
信息
- ID
- 701
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者