题目大意:
有n个人想要过河,每一次有两人可以坐船过河,一个人划回来,问最少过河时间
分析:
我们考虑abxy这四个人
a是最快的,b是次快的,x是最慢的,y是次慢的
我们需要把xy运送过河,有两种方法:
ab–>,<–a,xy–>,<–b
所需时间为x+b+b+a
ay–>,<–a,ax–>,<–a
所需时间为x+a+y+a
很明显这是对的,因为最慢的一定要和次慢的一起过河,而中途需要一个或者两个人把船划回来,那么最快的和次快的就充当了摆渡者的角色
代码如下:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1000+5;
int cas,n,tim[maxn];
signed main(void){
scanf("%d",&cas);
while(cas--){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&tim[i]);
sort(tim+1,tim+n+1);
if(n==1){
cout<<tim[1]<<endl;
continue;
}
int tail=n,ans=0;
while(tail>3){
ans+=tim[tail]+tim[1]+min(tim[2]+tim[2],tim[1]+tim[tail-1]);
tail-=2;
}
if(tail==3)
ans+=tim[1]+tim[2]+tim[3];
else
ans+=tim[2];
cout<<ans<<endl;
}
return 0;
}
by >_< neighthorn