描述
在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。
输入
第一行是一个整数T(1<=T<=20)表示测试数据的组数
每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河
每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<Si<=100)
输出
输出所有人都过河需要用的最少时间
样例输入
1 4 1 2 5 10
样例输出
17
思路:
主要运用贪心思想,在4个及以上人过河的时候 有两种方式。
一是让用时最少的和次少的过去作为接应,最少的再回来,之后最多的和次多的再过去次少的再回来,完成一组。
二是让最少的带着最多的过去,最少的再回来,再带着次多的过去,再回来,完成一组。
因此将N个人的过河时间从小至大排序,以两人为一组,每次选择最优解即可。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1050;
bool cmp(int a, int b)
{
return a < b;
}
int main(){
int T;
cin >> T;
while(T--){
int N,ans = 0;
int over[maxn];
cin >> N;
for(int i = 0; i < N; i++)
cin >> over[i];
sort(over,over+N,cmp);
int sum = 0;
while(N >= 4){
sum += min(2*over[1]+over[0]+over[N-1],2*over[0]+over[N-1]+over[N-2]); //每次选择最优情况
N -= 2;
}
if( N == 3)
sum += over[2]+over[0]+over[1];
else if(N == 2)
sum += over[1];
else sum += over[0];
cout << sum << endl;
}
return 0;
}