【题目描述】
几个人过河,每次过两人一人回,速度由慢者决定,问过河所需最短时间。
【输入】
输入t组数据,每组数据第1行输入n,第2行输入n个数,表示每个人过河的时间。
【输出】
输出t行数据,每行1个数,表示每组过河最少时间。
【输入样例】
1
4
1 2 5 10
【输出样例】
17
【思路】
1.首先我们要给每个速度从小到大排序,才能处理。
2.如果剩下的人数大于3,我们就有两种过河方案可供选择
第一种:S1+S1+Sn+Sn-1。
第二种:S1+2*S2+S3。
我们要选择时间较少的方案,累加到sum。
3.如果最后还剩两人,则一起过河,sum+=s[2];
如果还剩下三人,则S1+S2+S3的方法过河。
【代码】
#include<bits/stdc++.h>
using namespace std;
int t,n,s[10005],sheng,sum;
int main()
{
cin>>t;
for(int q=1;q<=t;q++)
{
sum=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
sort(s+1,s+n+1);//排序
sheng=n;
while(sheng>3)
{
sum+=min(s[2]*2,s[1]+s[sheng-1])+s[1]+s[sheng];//选择方案
sheng-=2;//每次运走最慢的两个
}
if(sheng==2)
{
sum+=s[2];
}
else if(sheng==3)
{
sum=sum+s[1]+s[2]+s[3];
}
cout<<sum<<endl;
}
return 0;
}
看没看懂都点个赞再离开吧!!!