贪心算法——加工木棍(C++)

上大学,一天是一天,两天也是一天。

——2024年6月27日


之前考试周断更了,今天重新开始!

题目描述

        有n根木棍,已知每根木棍的长度和重量。这些木棍在木工机器上加工,机器准备加工木棍需要一些时间,称为设置时间。机器设置时间如下:

①第一根木棍设置时间为1min。

②在处理长度为l、重量为w的木棍之后,如果 l ≤ l' 且 w ≤ w' ,则长度为 l' ,重量为 w' 的木棍不需要设置时间,否则需要1分钟设置时间。现在要找到处理n根木棍的最短设置时间,例如有5根木棍,其长度和重量分别为(9,4),(2,5),(1,2),(5,3)和(4,1),那么最小设置时间应该是2min,加工顺序为(4,1),(5,3),(9,4),(1,2),(2,5)。


输入格式

        输入两行,第一行有一个整数n(1 ≤ n ≤ 5000),表示测试用例重的木棍数量,第二行包含 2n 个整数l_1w_1l_2w_2,… l_iw_i…每个整数最大值为10000,其中l_iw_i分别为第 i 根木棍的长度和重量。

输出格式

        每个测试用例在一行中输出 ,应包含以分钟为单位的最短设置时间。

输入样例

5
9 4 2 5 1 2 5 3 4 1

输出样例

2


题目解析

        贪心法

        本题与活动安排问题I类似,在求解最多兼容的活动个数时,我们是怎么考虑的呢?

        要求最多能安排多少个活动,我们需要对每个活动按活动的结束时间递增排序,从第一个活动开始,以后的每个活动的开始时间都需要大于等于前一个活动的结束时间,这个题按照相同的思路,我们同样按长度递增排序(按重量排序同理),但这个题还需要满足木棍重量后者也需大于前者,所以还需在长度相同的情况下按重量进行递增排序,考虑用结构体重载函数实现。

        以题目给的例子为例,按上述思路排序之后为:

        (4,1),(1,2),(5,3),(9,4),(2,5)。

        从第一个木棍开始遍历,如果同时满足长度和质量均大于前一个木棍,就对当前木棍进行标记,表示已经加工完毕,直到遍历到最后一个,再对总时间加一;然后再次重复这个过程,直到所有的木棍均被标记即退出循环。


题解代码

1. 构建木棍的结构体;

struct Action{
    int l;
    int w;
    // 构造重载函数
    Action(int l, int w):l(l), w(w) {}
    bool operator<(const Action &a) const{
        if(l == a.l){
            return w <= a.w;
        }
        return l <= a.l;
    }
};

2. 定义设置时间函数;

int minActionTime(vector<Action> &v){
    int len = v.size();
    // 定义最短时间
    int minTime = 0;

    int flag[v.size() + 1];
    memset(flag, 0, sizeof(flag));//用于标记木棍

    // 一定要先排序
    sort(v.begin(), v.end());

    for(int i = 0; i < len; i++){
        cout<<"当前木棍长度"<<v[i].l<<",木棍质量"<<v[i].w<<endl;
        if(flag[i] == 0){//当前木棍还没有处理
            int pre = v[i].w;
            for(int j = i; j < len; j++){
                if(flag[j] == 0 && v[j].w >= pre){
                    pre = v[j].w;
                    flag[j] = 1;
                }
            }
            minTime++;
        }
    }
    return minTime;
}

3. 完整代码如下:

// 加工木棍
// 活动安排问题:第一个活动的结束时间小于等于第二个活动的开始时间

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>

using namespace std;

struct Action{
    int l;
    int w;
    // 构造重载函数
    Action(int l, int w):l(l), w(w) {}
    bool operator<(const Action &a) const{
        if(l == a.l){
            return w <= a.w;
        }
        return l <= a.l;
    }
};

int minActionTime(vector<Action> &v){
    int len = v.size();
    // 定义最短时间
    int minTime = 0;

    int flag[v.size() + 1];
    memset(flag, 0, sizeof(flag));

    // 一定要先排序
    sort(v.begin(), v.end());

    for(int i = 0; i < len; i++){
        cout<<"当前木棍长度"<<v[i].l<<",木棍质量"<<v[i].w<<endl;
        if(flag[i] == 0){//当前木棍还没有处理
            int pre = v[i].w;
            for(int j = i; j < len; j++){
                if(flag[j] == 0 && v[j].w >= pre){
                    pre = v[j].w;
                    flag[j] = 1;
                }
            }
            minTime++;
        }
    }
    return minTime;
}

int main(){
    vector<Action> v;

    for(int i = 0; i < 5; i++){
        int l, w;
        cin>>l>>w;

        v.push_back(Action(l, w));
    }
    int res = minActionTime(v);

    cout<<"最少"<<res<<"分钟";

    return 0;
}

4. 运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/748139.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8数据集标注

1 简介 数据集是必不可少的部分&#xff0c;数据集的优劣直接影响训练效果。一般来说&#xff0c;一个完整的数据集应该包括训练集、测试集和验证集。通常&#xff0c;数据集会被划分为训练集和测试集&#xff0c;比如将数据集的70%用作训练集&#xff0c;30%用作测试集。在进行…

深度学习在蛋白质结构预测的新突破:AlphaFold、RoseTTAFold与ESMFold

在蛋白质结构预测和功能预测领域&#xff0c;基于机器学习的方法最近取得了显著的进展。特别是深度学习技术在这个领域中展现出了强大的能力&#xff0c;代表性的技术有 DeepMind 的 AlphaFold 和 RoseTTAFold。这些技术利用了大量的生物数据和先进的神经网络架构&#xff0c;极…

【科学计算与可视化】3. Matplotlib 绘图基础

安装 pip install matplotlib 官方文档 https://matplotlib.org/stable/api/pyplot_summary.html 主要介绍一些图片绘制的简要使用&#xff0c;更加详细和进阶需要可参考 以上官方文档。 1 绘制基础 方法名说明title()设置图表的名称xlabel()设置 x 轴名称ylabel()设置 y 轴…

在vscode 中ssh连接虚拟ubuntu,不能使用code打开文件

这是参考别人的文章&#xff1a;https://blog.csdn.net/weixin_44465434/article/details/130035032找到vscode的版本信息&#xff0c;提交后面是需要的打开home/(用户)/.bashrc&#xff0c;添加环境变量 export PATH"~/.vscode-server/bin/5437499feb04f7a586f677b155b03…

6.22套题

B. Dark 题意&#xff1a;每次能在数列中能使相邻两个数-1&#xff0c;求当数列没有连续非0值的最小贡献 解法:设表示前i个数中前i-1个数是否为0&#xff0c;当前数是j的最小贡献。表示i1以后减掉d的最小贡献。 C. 幸运值 D. 凤凰院真凶

Docker 日志

日志记录是任何生产应用程序中至关重要的一部分。当出现问题时&#xff0c;日志可以是恢复服务的关键工具&#xff0c;所以它们需要做好。在 Linux 系统上&#xff0c;我们期望通过一些常见方式与应用程序日志交互&#xff0c;有些方式更好。如果您在一台计算机上运行应用程序进…

文华财经盘立方均线-支撑压力自动画线多空声音预警指标公式源码

文华财经盘立方多空均线-支撑压力自动画线指标公式源码&#xff1a; //MA5:MA(C,5); //MA10:MA(C,10); MA20:MA(C,20),COLORRED; MA60:MA(C,60),COLORGREEN; TY:CLOSE; HD:FILTER(BACKSET(FILTER(REF(TY,10)HHV(TY,2*101),10),101),10); LD:FILTER(BACKSET(FILTER(REF(T…

openlayer 图层绘制成多种颜色的一个图层

技术栈&#xff1a; 因为是旧项目的优化功能&#xff0c;这里主要介绍实现思路。技术栈&#xff1a;openlayer 6.5^、jquery、layui组件。 背景&#xff1a; 在创建一个地图对象后&#xff0c;如何创建此处省略。这里主要讲解如何根据接口的数据来把水深测量时间的图层根据不同…

vue2的待办事项案例

头部组件 <template><div class"todo-header"><input type"text" placeholder"请输入你的任务名称&#xff0c;按回车键确认" keyup.enter"add"/></div> </template><script>import {nanoid} fro…

智能语音抽油烟机:置入WTK6900L离线语音识别芯片 掌控厨房新风尚

一、抽油烟机语音识别芯片开发背景 在繁忙的现代生活中&#xff0c;人们对于家居生活的便捷性和舒适性要求越来越高。传统的抽油烟机操作方式往往需要用户手动调节风速、开关等功能&#xff0c;不仅操作繁琐&#xff0c;而且在烹饪过程中容易分散注意力&#xff0c;增加安全隐…

【5G射频基本架构】

平台框架 平台演进及搭配 5G NR频谱 NSA/SA/ENDC

Java登录管理功能的自我理解(尚庭公寓)

登录管理 背景知识 1. 认证方案概述 有两种常见的认证方案&#xff0c;分别是基于Session的认证和基于Token的认证&#xff0c;下面逐一进行介绍 基于Session 基于Session的认证流程如下图所示 该方案的特点 登录用户信息保存在服务端内存&#xff08;Session对象&#xff…

安全技术和防火墙(iptables)

安全技术 入侵检测系统&#xff1a;特点是不阻断网络访问&#xff0c;主要是提供报警和事后监督&#xff0c;不主动介入&#xff0c;类似于监控。 入侵防御系统&#xff1a;透明模式工作&#xff0c;对数据包&#xff0c;网络监控&#xff0c;服务攻击&#xff0c;木马&#…

【数据结构】(C语言):栈

栈&#xff1a; 线性的集合。后进先出&#xff08;LIFO&#xff0c;last in first out&#xff09;。两个指针&#xff1a;指向栈顶和栈底。栈顶指向最后进入且第一个出去的元素。栈底指向第一个进入且最后一个出去的元素。两个操作&#xff1a;入栈&#xff08;往栈尾添加元素…

力扣最新详解5道题:两数之和三数之和四数之和

目录 一、查找总价格为目标值的两个商品 题目 题解 方法一&#xff1a;暴力枚举 方法二&#xff1a;对撞指针 二、两数之和 题目 题解 方法一&#xff1a;暴力枚举 方法二&#xff1a;哈希表法 三、三数之和 题目 题解 方法一&#xff1a;排序暴力枚举set去重 …

C++ | Leetcode C++题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution { private:void dfs(vector<vector<char>>& grid, int r, int c) {int nr grid.size();int nc grid[0].size();grid[r][c] 0;if (r - 1 > 0 && grid[r-1][c] 1) dfs(grid, r - 1, c);if (r …

智能革新:AI写作工具如何重塑论文生成的艺术

在学术探索的征途中&#xff0c;AI论文工具本应是助力前行的风帆&#xff0c;而非让人陷入困境的漩涡。我完全理解大家在面对论文压力的同时&#xff0c;遭遇不靠谱AI工具的沮丧与无奈。毕竟&#xff0c;时间可以被浪费&#xff0c;但金钱和信任却不可轻弃。 作为一名资深的AI…

解锁数据资产的无限潜能:深入探索创新的数据分析技术,挖掘其在实际应用场景中的广阔价值,助力企业发掘数据背后的深层信息,实现业务的持续增长与创新

目录 一、引言 二、创新数据分析技术的发展 1、大数据分析技术 2、人工智能与机器学习 3、可视化分析技术 三、创新数据分析技术在实际应用场景中的价值 1、市场洞察与竞争分析 2、客户细分与个性化营销 3、业务流程优化与风险管理 4、产品创新与研发 四、案例分析 …

Redis 缓存一致性

Redis 业务结构 流程图 缓存一致性 Redis 和 MySQL 中数据保持一致 双检加锁策略 主要用于解决多线程环境下的并发问题&#xff0c;确保在高并发场景下对共享资源的访问是互斥的&#xff0c;避免因竞争条件导致的不一致状态 public User findUserById(Integer id) {User user …

使用新H5标签dialog,实现点击按钮显示分享链接弹出层交互功能

使用新H5标签&#xff0c;实现点击按钮显示分享链接弹出层交互功能 在现代网页开发中&#xff0c;使用新技术和标签来提升用户体验是非常重要的。今天&#xff0c;我们就来聊聊如何利用HTML5的<dialog>标签来实现一个简洁实用的分享链接功能。 在过去&#xff0c;我们通常…