题目链接
珥陵拔大学的lglg的n个克隆体准备包车参加暑期解密赛,他们包下了zzy的自行车。zzy的自行车有后座,所以最多能载2个人(一个人骑一个人坐)。
已知每个克隆体来去赛场所需的时间ti,每次所用时间等于车上成员所需时间的最大值。请求出全部到达赛场需要的最少耗时。
输入
输入包含多组测试数据。第一行含有一个正整数T,表示数据组数。
每组数据的第一行含有一个整数N。接下来的一行含有N个整数,表示ti。
输出
对于每组输入数据输出一行,每行包括1个整数,代表该组数据下全员抵达赛场的最少耗时。
样例输入
2
4
1 2 5 10
5
1 2 8 7 6
样例输出
17
22
数据范围
1≤T≤20
1≤N≤1000
1≤ti≤100
提示
Zydsg的自行车骑到赛场后不会自动飞回来的哦~
解题思路
贪心题
先sort一下,a[1]是最快的
只有一个人的时候,就让那个人自己去(耗时a[1]) ,ans+=a[1]
只有两个人的时候,两个人一块去(耗时a[2]) ,ans+=a[2]
只有三个人的时候,最快的带着最慢的去(耗时a[3]),然后最快的回来(耗时a[1]),再带着次慢的去(耗时a[2]) ans+=(a[1]+a[2]+a[3])
大于等于四个人的时候
一开始只想到了最快的带着最慢的(耗时a[n]) ,然后最快的回来(耗时a[1]) ,再带一个次慢的去(耗时a[n-1]),然后最快的再回来(耗时a[1]) ans+=(a[n]+a[1]+a[n-1]+a[1])。。。然后第一个样例出不来。
这道题有两种解法。。笨蛋如我只想到了第一种。
第二种是 最快的带着次快的去(耗时a[2]),最快的回来(耗时a[1]),最慢的带着次慢的去(耗时a[n]),然后次慢的回来(耗时a[2]),
ans+=(a[2]+a[1]+a[n]+a[2])
所以第二种方法需要 ans+=(min(a[2]+a[1]+a[n]+a[2],a[n]+a[1]+a[n-1]+a[1]));
代码如下
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int a[1010];
int main()
{
int t;
int n;
int i;
int ans=0;
cin>>t;
while(t--)
{
ans=0;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
while(n>0)
{
if(n==1)
{
ans+=a[n];
n=0;
}
else if(n==2)
{
ans+=a[n];
n=0;
}
else if(n==3)
{
ans+=(a[1]+a[2]+a[n]);
n=0;
}
else
{
ans+=(min(a[2]+a[1]+a[n]+a[2],a[n]+a[1]+a[n-1]+a[1]));
n-=2;
}
}
cout<<ans<<endl;
}
return 0;
}