贪心算法:小船过河问题

贪心算法:小船过河问题

题意:N个人过河,船每次只能坐两个人,船载每个人过河的所需时间不同t[i],每次过河的时间为船上的人的较慢的那个,问最快的过河时间。(船划过去要有一个人划回来)
最优选择:
先将所有人过河所需的时间按照升序排序考虑把单独过河所需要时间最多的两个旅行者送到对岸去,有两种方式:
1.最快的和次快的过河,然后最快的将船划回来;次慢的和最慢的过河,然后次快的将船划回来,时间:t[0]+2t[1]+t[n-1];
2.最快的和最慢的过河,然后最快的将船划回来,最快的和次慢的过河,然后最快的将船划回来,时间:2
t[0]+t[n-2]+t[n-1]。

上述分析存在于至少四个人的时候,少于三个人情况,我们单独讨论一下就好。

#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <ctime>
#include <vector>
#include <fstream>
#include <list>
#include <iomanip>
#include <numeric>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf = 0x3f3f3f3f;
const int N=1e3+5;
int t[N];
int main() 
{
	int T,n;
	cin>>T;
	while(T--){
		cin>>n;
		for(int i=0;i<n;i++){
			cin>>t[i];
		}
		sort(t,t+n);//排序
		int sum=0,ks1,ks2;
		while(n>3){//条件选取
			ks1=t[0]+2*t[1]+t[n-1];
			ks2=t[n-1]+2*t[0]+t[n-2];//情况列举
			if(ks1>ks2){
				sum+=ks2;
			}else{
				sum+=ks1;
			}
			n-=2;
		}
		if(n==3){//边界讨论
			sum+=(t[0]+t[1]+t[2]);
		}else if(n==2){
			sum+=t[1];
		}else{
			sum+=t[0];
		}
		cout<<sum<<endl	
    return 0;
}


贪心算法可以用来解决小船过河问题。根据题意,我们找到最快的过河时间。根据引用中的描述,最优选择是先将所有人过河所需的时间按照升序排序。然后我们可以考虑以下种情况: 1. 最快的和次快的过河,然后最快的将划回来;次慢的和最慢的过河,然后次快的将划回来。这种情况的总时间为t + 2t + t[n-1。 2. 最快的和最慢的过河,然后最快的将划回来;最快的和次慢的过河,然后最快的将划回来。这种情况的总时间为2t + t[n-2 + t[n-1。 通过比较这种情况的总时间,我们可以选择其中较小的时间作为最快的过河时间。这样,我们就可以使用贪心算法解决小船过河问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [贪心算法——小船过河](https://blog.csdn.net/yangqiang1997/article/details/110232659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [贪心算法小船过河问题](https://blog.csdn.net/dengmeiqing1378/article/details/102417708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [JS基于贪心算法解决背包问题示例](https://download.csdn.net/download/weixin_38627213/13194957)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值