#include <iostream>
#include <algorithm>
using namespace std;
const int M =1110;
int a[M];
// 返回的理应选已过河中时间最快的(用其他人送显然没有他好)
// 每次过河时间取决于两人之中较慢的
// 每次把最慢和次慢的两个人送过河时并且使灯在起点时 最快 a 次快 b 最慢x 次慢y
//: 和最快的过河 最快的在 返回 x+a+y+a 返回的时间优化到最短
//: 和次慢的人走 次慢的人过河时间以后就不用在考虑了 ——需要有人返回 显然应该选把 最快和次快的先送 b+a+x+b 去的时间优化到最短
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int ans=0;
sort(a+1,a+n+1);
while(n)
{
if(n==1) //
{
ans+=a[1];
break;
}
if(n==2)
{
ans+=a[2];
break;
}
if(n==3)
{ //c+a+b< c+b+b
ans+=a[3]+a[1]+a[2]; // 最快的人带
break;
}
int k=2*a[1]+a[n]+a[n-1];
int l=2*a[2]+a[1]+a[n];
if(k<l)
{
ans+=k;
}
else
{
ans+=l;
}
n-=2;
}
cout<<ans<<endl;
}
return 0;
}
poj 1700 过河贪心
最新推荐文章于 2024-06-30 21:45:29 发布
