题意:
有n个人过河,只有一条船,每次只能坐2人,每个人过河所需时间不同,求全部过河所需的最短时间。
解题思路:
当人数等于1时:sum=Num[1];
当人数等于2时:sum=Num[2];
当人数等于3时:sum=Num[3]+Num[2]+Num[1];//设num[3]最慢 num[1]最快 最快的与最慢的先过 消耗num[3] 最快的回来接另一个 消耗num[1] 最后两个人一起过河 消耗num[2] 所以三个人时所需时间实际是三个人过桥时间之和
重点在这里OwO:
当人数大于等于4时:
若设过桥速度最快的那个人过桥时间为a,第二快为b;过桥第二慢的那个人过桥时间为c,最慢为d;
此时有两种过桥方案:
一.最快和次快的人先过,然后最快的回来,然后最慢与次慢的人再过,次快的回来;
二.最快的和最慢的过,快的回来,在和次慢的过,快的再回来;
第一种方法时间为b*2+a+d;
第二种方法时间为c+d+2*a
如果第一种大于第二种有2*b+a+d>c+d+2*a
化简得
有n个人过河,只有一条船,每次只能坐2人,每个人过河所需时间不同,求全部过河所需的最短时间。
解题思路:
当人数等于1时:sum=Num[1];
当人数等于2时:sum=Num[2];
当人数等于3时:sum=Num[3]+Num[2]+Num[1];//设num[3]最慢 num[1]最快 最快的与最慢的先过 消耗num[3] 最快的回来接另一个 消耗num[1] 最后两个人一起过河 消耗num[2] 所以三个人时所需时间实际是三个人过桥时间之和
重点在这里OwO:
当人数大于等于4时:
若设过桥速度最快的那个人过桥时间为a,第二快为b;过桥第二慢的那个人过桥时间为c,最慢为d;
此时有两种过桥方案:
一.最快和次快的人先过,然后最快的回来,然后最慢与次慢的人再过,次快的回来;
二.最快的和最慢的过,快的回来,在和次慢的过,快的再回来;
第一种方法时间为b*2+a+d;
第二种方法时间为c+d+2*a
如果第一种大于第二种有2*b+a+d>c+d+2*a
化简得
2*b>c+a;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX=1006;
int n,Pe[MAX];
int main()
{
int t;
scanf("%d",&t);
while( t-- )
{
scanf("%d",&n);
for( int i=1; i<=n; ++i )
scanf("%d",&Pe[i]);
sort(Pe,Pe+n+1);
int sum=0;
while( n )
{
if(n==1)
{
sum+=Pe[1]; break;
}
else if( n==2 )
{
sum+=Pe[2]; break;
}
else if( n==3 )
{
sum+=Pe[3]+Pe[1]+Pe[2]; break;
}
else{
if( 2*Pe[2]>Pe[1]+Pe[n-1] )
sum+=2*Pe[1]+Pe[n-1]+Pe[n];
else
sum+=2*Pe[2]+Pe[1]+Pe[n];
n-=2;
}
}
printf("%d\n",sum);
}
return 0;
}