首页 > 编程语言 >算法设计与分析(乘船问题

算法设计与分析(乘船问题

时间:2024-09-19 12:23:33浏览次数:3  
标签:num int 旅客 算法 乘船 体重 设计 配对



目录

  • 题目描述
  • 解题思路
  • 代码实现
  • 小结:


题目描述

给定一批轮船,每艘轮船的最大载重量均为M,每艘船最多只允许装两个人,旅客总人数最多为50人。每个旅客的体重不同。现要求设计算法求出装走所有旅客所需轮船的最少数量。

输入格式

第一行输入为每艘船的最大载重量M和旅客总人数num。
第二行输入是每个旅客的体重(整数)。

输出格式

输出所需最少租船数量。

解题思路

本题可以使用贪心算法来解决。贪心算法的思想是在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。

排序:首先将所有旅客的体重进行从小到大排序。这样可以尽可能地将最重的旅客与最轻的旅客配对,从而更有效地利用每艘船的载重能力。

双指针:使用两个指针p_l和p_r,分别指向体重数组的开始和结束。这两个指针模拟了从两端向中间配对的过程。

遍历:在p_l小于等于p_r的条件下进行循环。每次循环检查当前最轻的旅客和最重的旅客的体重之和是否小于等于船的最大载重量M。

如果是,说明这两个旅客可以装在同一艘船上,将p_l向右移动一位,p_r向左移动一位。
如果不是,说明最重的旅客无法与当前最轻的旅客配对,只能单独装一艘船(或尝试与下一个较轻的旅客配对),将p_r向左移动一位。
计数:每成功装载一对旅客(或单独装载一个旅客),就增加所需的船只数量result。

输出结果:循环结束后,输出result作为答案。

代码实现

下面是该算法的C++实现:

#include<iostream>  
#include<algorithm>  
  
using namespace std;  
  
#define MAXSIZE 50  
  
int main() {  
    // 输入数据   
    int w[MAXSIZE], num, M;  
    cin >> M >> num;  
      
    for (int i = 0; i < num; i++){  
        cin >> w[i];  
    }  
      
    // 贪心算法  
    sort(w, w + num);	// 从小到大排序   
      
    int p_l = 0;  
    int p_r = num - 1;  
    int result = 0;  
      
    while (p_l <= p_r){  
        if ((w[p_l] + w[p_r]) <= M){  
            p_l++;p_r--;  
        }  
        else{  
            p_r--;  
        }  
    }  
      
    cout << result << endl;  
    return 0;  
}

标签:num,int,旅客,算法,乘船,体重,设计,配对
From: https://blog.51cto.com/u_16672541/12055876

相关文章

  • 算法设计与分析(阶乘
    目录计算阶乘的递归函数阶乘函数的实现代码解释递归的优点与缺点优点:缺点:小结:计算阶乘的递归函数在编程中,阶乘是一个常见的概念,它表示从1乘到某个给定数n的所有整数的乘积。例如,5的阶乘(记作5!)是12345=120。这里,我们将通过C++语言实现一个递归函数来计算任意非负整数的阶乘。递归......
  • 算法设计与分析(二分查找算法
    目录二分查找算法详解引言算法步骤代码实现注意事项结论小结:二分查找算法详解引言二分查找算法是一种在有序数组中查找特定元素的搜索算法。它通过不断将数组分成两半,缩小搜索范围,从而快速定位到目标元素的位置。二分查找算法的时间复杂度为O(logn),其中n是数组的长度。算法步骤......
  • 【计算机专业最新Java必过毕设选题推荐2025】基于springboot个人在线博客blog网站设计
    作品简介 Hi,各位同学好呀!今天向大家分享一个最新完成的高质量毕业设计项目作品基于springboot的XXX管理系统项目评分(最低0分,满分5分)难度系数:3分工作量:5分创新点:3分界面美化:5分使用技术前端:html/js/css后端:springboot数据库:MySql服务器:apache-tomcat......
  • 设计模式——命令模式
    设计模式——命令模式1.智能生活需求看一个具体的需求我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装app就可以控制对这些家电工作。这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App,分别控制,我们希望只要一个app就可以控......
  • 分类预测 | Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预测
    分类预测|Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预测目录分类预测|Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料分类效果基本描述1.Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预......
  • 算法学习-Dancing Links X
    DancingLinksX舞蹈链。实质为用循环十字链在图上将所有“1”的位置链起来构造较为巧妙,且极易理解,本题为DLX模板(精确覆盖问题)DLX算法的题目做法一般为将所求方案转化为行号,将限制条件转化为列号然后dfs暴力枚举,用循环十字链优化/*Finishedat12:14on2024.4.5*/#......
  • 算法学习-CDQ分治
    对于二维偏序,为普通的求逆序对,只需要先排序一遍,然后树状数组或双指针即可而三位偏序甚至更高,则需要用CDQ分治,简单来说,就是将树状数组和双指针结合操作步骤如下:1.开始将数组按第一维排序,保证满足x性质2.在归并中,将左右分别按y排序,因为开始以x排序,所以保证了正确性,保证贡献从左......
  • 【算法】堆与优先级队列
    【ps】本篇有4道 leetcode OJ。目录一、算法简介二、相关例题1)最后一块石头的重量.1-题目解析.2-代码编写2)数据流中的第K大元素.1-题目解析.2-代码编写3)前K个高频单词.1-题目解析.2-代码编写4)数据流的中位数.1-题目解析.2-代码编写 一、算......
  • springboot零食购物系统-计算机毕业设计源码43357
    基于Web零食购物系统的设计与实现摘要本项目旨在设计和实现一个基于Web的零食购物系统,旨在满足用户对零食购物的便捷性和个性化需求。通过整合现代Web开发技术,包括前端界面设计和后端逻辑开发,系统将实现用户注册登录、商品浏览、购物车管理、订单结算等功能,旨在为用户提供......
  • 多输入多输出 | Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测
    多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测目录多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料预测效果基本介绍多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入......