题意:有n个人要过桥,每次只能过一个或两个人,只有一个手电筒,所以如果还有人未过桥要有人把手电筒带回来,每个人过桥时间都不相同,问所有人过桥最少需要多长时间。
题解:贪心,有两种选择,一种是最快的人和次快的人先过桥,然后最快的人回来,最慢的人和次慢的人过桥,次快的人回来,另一种选择是最快的人先和最慢的人过桥,最快的人回来,最快的人再和次慢的人过桥,最快的人再回来,每次比较两种花费时间那个更短用哪个方法将最慢和次慢的两个人送走。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1005;
int n, ti[N], res;
void solve() {
int cnt = n;
while (n > 3) {
if (ti[1] * 2 < ti[0] + ti[n - 2])
res += ti[0] + ti[1] * 2 + ti[n - 1];
else
res += ti[0] * 2 + ti[n - 1] + ti[n - 2];
n -= 2;
}
if (n == 2)
res += ti[1];
else if (n == 3)
res += ti[0] + ti[1] + ti[2];
else
res += ti[0];
printf("%d\n", res);
n = cnt;
while (n > 3) {
if (ti[1] * 2 < ti[0] + ti[n - 2])
printf("%d %d\n%d\n%d %d\n%d\n", ti[0], ti[1], ti[0], ti[n - 2], ti[n - 1], ti[1]);
else
printf("%d %d\n%d\n%d %d\n%d\n", ti[0], ti[n - 1], ti[0], ti[0], ti[n - 2], ti[0]);
n -= 2;
}
if (n == 2)
printf("%d %d\n", ti[0], ti[1]);
else if (n == 3)
printf("%d %d\n%d\n%d %d\n", ti[0], ti[2], ti[0], ti[0], ti[1]);
else
printf("%d\n", ti[0]);
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
res = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &ti[i]);
sort(ti, ti + n);
solve();
if (t)
printf("\n");
}
return 0;
}