poj1700

題目鏈接
珥陵拔大學的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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章