【阿里巴巴】题目:小强作为强班的班长.决定带着包含他在内的个同学去春游.路程走到一半,发现前面有一条河流.且只有一条小船.经过实验后发现,这个小船一次最多只能运送两个人.而且过河的时间是等于两个人中体重较大的那个人的体重.如果只有一个人,那么过河时间就是这个人的体重.现在小强想请你帮他分析如何安排才能在最短时间内使所有人都通过这条河流.小强很懒,他并不想知道具体怎么过河,只要你告诉他最短的时间.
思路:人数大于4时,过河时先将最重的两个人渡过去,此时有两种思路,一种是最轻的人走2次,每次带一个。另一种是最轻和次轻先过去,最轻回来,最重和次重坐过去,次轻回来。
#include<iostream>
#include<algorithm>
using namespace std;
int s[100005];
int main(){
int T;
cin>> T;
while(T--){
int n;
cin>>n;
for(int i = 1;i <= n;i++){
cin>>s[i];
}
sort(s+1,s+n+1);
long ans= 0;
while(n>=4){
ans+=min((s[1]*2+s[n-1]+s[n]),s[1]+2*s[2]+s[n]);
n-=2;
}
if(n==3){
ans+=s[1]+s[2]+s[3];
}
else if(n==2){
ans+=s[2];
}
else if(n==1){
ans+=s[1];
}
cout<<ans<<endl;
}
return 0;
}