我们先从简单的情况来考虑:
当有两个人的时候,
T
=
m
a
x
(
x
1
,
x
2
)
T=max(x_1,x_2)
T=max(x1,x2)
当有三个人的时候,
T
=
x
1
+
x
2
+
x
3
T=x_1+x_2+x_3
T=x1+x2+x3
当有四个人的时候
x
1
,
x
2
,
x
3
,
x
4
x_1,x_2,x_3,x_4
x1,x2,x3,x4(已经按照从小到大顺序排好了),我们有两种选择:
第一种是让
x
1
,
x
2
x_1,x_2
x1,x2先过去,
x
1
x_1
x1回来,
x
3
,
x
4
x_3,x_4
x3,x4过去,
x
2
x_2
x2回来,然后
x
1
,
x
2
x_1,x_2
x1,x2一起过去,
T
1
=
x
2
+
x
1
+
x
4
+
x
2
+
x
2
T_1=x_2+x_1+x_4+x_2+x_2
T1=x2+x1+x4+x2+x2=
x
1
+
3
∗
x
2
+
x
4
x_1+3*x_2+x_4
x1+3∗x2+x4
第二种:
让
x
1
x_1
x1带
x
4
x_4
x4过去,再回来,
x
1
x_1
x1带
x
3
x_3
x3过去,再回来,再跟
x
2
x_2
x2一起过去,
T
2
=
x
4
+
x
1
+
x
3
+
x
1
+
x
2
T_2=x_4+x_1+x_3+x_1+x_2
T2=x4+x1+x3+x1+x2=
2
∗
x
1
+
x
2
+
x
3
+
x
4
2*x_1+x_2+x_3+x_4
2∗x1+x2+x3+x4
因此,我们在解决n个人的时候,我们需要用时间最短的那两个人带后面的人过去,
T
=
m
i
n
(
x
1
+
2
∗
x
2
+
x
n
,
2
∗
x
1
+
x
n
−
1
+
x
n
)
T=min(x_1+2*x_2+x_{n},2*x_1+x_{n-1}+x_{n})
T=min(x1+2∗x2+xn,2∗x1+xn−1+xn);
代码如下:
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int clo[100+5];
int main()
{
int num;
cin>>num;
for(int i=0;i<num;++i)
cin>>clo[i];
sort(clo,clo+num);
int res=0;
num--;
while(num>0)
{
if(num==1)
{
res+=clo[1];
// cout<<res<<"----"<<endl;
break;
}
if(num==2)
{
res+=clo[0]+clo[1]+clo[2];
//cout<<res<<"/"<<endl;
break;
}
else
{
res+=min(clo[0]+clo[1]*2+clo[num],clo[0]*2+clo[num-1]+clo[num]);
// cout<<res<<"****"<<endl;
num-=2;
}
}
cout<<res<<endl;
}