題目鏈接
珥陵拔大學的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;
}