乘船🐬
🐠 问题描述:
有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;
}
🐙测试案例+运行结果:
💩正经致谢: