poj 1700 过河贪心

本文介绍了一个基于排序和选择最优组合的算法,用于解决特定条件下人物过河问题,目标是最小化所有人过河所需的时间。通过分析不同人数情况下的最优策略,并使用C++实现算法。

点击打开链接

#include <iostream>
#include <algorithm>
using namespace std;
const int M =1110;
int a[M];


// 返回的理应选已过河中时间最快的(用其他人送显然没有他好) 


// 每次过河时间取决于两人之中较慢的 
// 每次把最慢和次慢的两个人送过河时并且使灯在起点时		   最快 a 次快 b 最慢x 次慢y 
//:  和最快的过河 最快的在 返回   x+a+y+a	 返回的时间优化到最短		 
//: 和次慢的人走 次慢的人过河时间以后就不用在考虑了 ——需要有人返回 显然应该选把 最快和次快的先送  b+a+x+b 去的时间优化到最短 
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
		}
	
		int ans=0;
		sort(a+1,a+n+1);
		while(n)
		{
			if(n==1) //
			{	
				ans+=a[1];
				break;
			}
			if(n==2)
			{
				ans+=a[2];
				break;
			}
			if(n==3)
			{							//c+a+b< c+b+b
				ans+=a[3]+a[1]+a[2]; // 最快的人带 
					
				break;
				
			}
			int k=2*a[1]+a[n]+a[n-1];
			int l=2*a[2]+a[1]+a[n];
			if(k<l)
			{
				ans+=k;
			}	
			else
			{
				ans+=l;
			}			
			n-=2;
		}
		cout<<ans<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值