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;
} 

猜你喜欢

转载自blog.csdn.net/weixin_43819762/article/details/104850778