贪心入门案例(三)---------乘船问题

                                   乘船🐬

🐠 问题描述:

                           有n个人想要坐船去对岸, 每个人都有重量但不一定相等

                          现在有无数多船,所有船都有一个固定的最大承载量c 每条船最多只能坐2个人。

                          请问怎么分配能使用最少的船只使所有人都过河?

🐳解题思路:(有点类似与快速排序的感jio~)

               首先,我们很容易想到最重的与最轻的匹配,充分利用空间,

               的确.只要我们先找到最轻的人,然后看看他和最重的人可不可以共乘一条船:

1. 若可以,直接最重的与最轻的乘坐一艘。然后在剩下的人中再将最轻的与最重的匹配,看是否两人的体重和小于c,满足条件直接乘船走,重复执行此步,若不满足进行下面操作:

2.如果不行,最重的只能自己一艘船(最轻的都不行其他体重更不行)。然后,最轻的与第二重的人匹配,如果还是不行,那就给第二重的单独分配一条船,再继续与第三重的匹配看是否两人体重和超过c,,,,一直重复判断,,,直到最轻的人找到了匹配的小伙伴为止,乘坐一艘船离开。

🐢程序代码:

#include<iostream>	
#include<algorithm>
#define N 100
using namespace std;
int main(){
	int a[N];
	int n,c;
	cin>>n; //输入初始可选物品总数 
	cin>>c;//输入背包的容量 
	for(int k=0;k<n;k++){
		cin>>a[k];	
	} 
	sort(a,a+n);
	int sum=0;//sum用于统计船数
	int i=0,j=n-1; 
	while(i<=j){
		if(i==j){  //i=j说明就剩一个人了,只能孤零零的自己离开 
			sum++;
			printf("体重为%d的小可怜自己走啦~\n",a[i]); 
			break; 
		}
		if(a[i]+a[j]<=c){
			sum++;  //小胖和小瘦一起走了 
			printf("体重为%d和体重为%d的走啦~\n",a[i],a[j]); 
			j--;
			i++;
		}
		else{      
		    printf("体重为%d的小胖胖自己走啦~\n",a[j]) ;
			j--; //最重的人自己乘个小破船走了 
			sum++;	
		}
	}
	cout<<"一共需要"<<sum<<"艘小破船"<<endl; 
	return 0;
}

🐙测试案例+运行结果:

💩正经致谢:

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值