当前位置: 首页 > news >正文

贪心算法——加工木棍(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;
}

运行结果

相关文章:

  • 上位机图像处理和嵌入式模块部署(mcu 项目1:上位机编写)
  • vue3实现多表头列表el-table,拖拽,鼠标滑轮滚动条优化
  • Batch Size 不同对evaluation performance的影响
  • Stream toArray 好过collect
  • 常用知识点问答
  • 【Spring Boot】Java 持久层 API:JPA
  • 数据结构-第七章(B树和B+树)
  • 每日一道算法题 判断子序列
  • linux 环境报错:Peer reports incompatible or unsupported protocol version
  • sheng的学习笔记-hadoop,MapReduce,yarn,hdfs框架原理
  • 不使用AMap.DistrictSearch,通过poi数据绘制省市县区块
  • 巴西市场有哪些电商平台?巴西最畅销的产品有哪些?
  • 揭秘,PyArmor库让你的Python代码更安全
  • Linux 程序打包
  • 时尚品牌GOODBAI好人好事系列纪录片——Jupiter乐队的热血与梦想
  • @jsonView过滤属性
  • Android开源项目规范总结
  • CSS实用技巧干货
  • Intervention/image 图片处理扩展包的安装和使用
  • Joomla 2.x, 3.x useful code cheatsheet
  • Making An Indicator With Pure CSS
  • Map集合、散列表、红黑树介绍
  • mockjs让前端开发独立于后端
  • nodejs实现webservice问题总结
  • pdf文件如何在线转换为jpg图片
  • python学习笔记-类对象的信息
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue学习系列(二)vue-cli
  • 分布式任务队列Celery
  • 给第三方使用接口的 URL 签名实现
  • 模型微调
  • 实现菜单下拉伸展折叠效果demo
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • (libusb) usb口自动刷新
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (一)基于IDEA的JAVA基础12
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .Net各种迷惑命名解释
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET正则基础之——正则委托
  • :“Failed to access IIS metabase”解决方法
  • @angular/cli项目构建--http(2)
  • @EnableAsync和@Async开始异步任务支持
  • @RunWith注解作用