【问题描述】

  • 现有n根木棒,已知它们的长度和重量。要用一部木工机一根一根地加工这些木棒。该机器在加工过程中需要一定的准备时间,是用于清洗机器,调整工具和模版的。
  • 木工机需要的准备时间如下:
    (1)第一根木棒需要1min的准备时间;
    (2)在加工了一根长为l ,重为w的木棒之后,接着加工一根长为l ’
    (l ≤ l’ ),重为 w’ ( w≤w’)的木棒是不需要任何准备时间的,否则需要一分钟的准备时间。
  • 给定n根木棒,找到最少的准备时间。
  • 例如现在有长和重分别为(4,9),(5,2),(2,1),(3,5)和(1,4)的五根木棒,那么所需准备时间最少为2min,顺序为
    (1,4),(3,5),(4,9),(2,1),(5,2)
    输入
    输入有多组测试例。输入数据的第一行是测试例的个数T。
    每个测试例两行:
    第一行是一个整数n(1≤n≤5000),表示有多少根木棒;
    第二行包括n×2个整数,表示l1,w1,l2,w2,l3,w3,…,ln,wn,其中li和wi表示第i根木棒的长度和重量。
    数据由一个或多个空格分隔。
    输出
    输出是以分钟为单位的最少准备时间,一行一个。
    输入样例
    3
    5
    4 9 5 2 2 1 3 5 1 4
    3
    2 2 1 1 2 2
    3
    1 3 2 2 3 1
    输出样例
    2
    1
    3

【算法分析】

本题仅仅使用贪心算法是不够的,排序之后还要使用动态规划的算法。
(1)数据结构
采用结构体表示木棒的信息:

#define maxN 5001
struct stick
{ int l;            //木棒的长度int w;           //木棒的重量
};
stick data[maxN];       //存放所有木棒

2)按木棒的长度使用贪心算法
利用C++的标准模板库函数sort()实现排序:

sort(data, data+n, cmp);

排序函数cmp()的实现:

int cmp(stick a, stick b)
{ //长度相等时,按重量排序if (a.l == b.l)     return a.w < b.w; //优先按长度排序else if (a.l < b.l) return true;return false;
}

(3)使用动态规划的方法,计算重量w的最长单调递增子序列的个数
用数组b记录重量w的分组序号。
在表中,4,5和9的组序号是1,1和2的组序号是2。

【算法实现】

// 计算重量w的最长单调递增子序列个数的动态规划实现
//形参n是木棒的数量,stick是木棒参数的数组
int LIS(int n, stick a[])
{//数组b表示木棒分组的序号int b[maxN];memset(b, 0, sizeof(b));int i, j, k;b[0]=1;for (i=1; i<n; i++) {//计算第i个木棒的的分组序号k=0;for (j=0; j<i; j++) if (a[i].w<a[j].w && k<b[j]) k=b[j];b[i]=k+1;}//查找最大的分组序号(数组b中的最大值)int max=0;for (i=0; i<n; i++)if (b[i]>max) max=b[i];return max;
}
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <algorithm>
using namespace std;#define maxN 5001
struct stick
{ int l; int w;
}; int LIS(int n, stick a[])
{int b[maxN];memset(b, 0, sizeof(b));int i, j, k;b[0]=1;for (i=1; i<n; i++) {k=0;for (j=0; j<i; j++) if (a[i].w<a[j].w && k<b[j]) k=b[j];b[i]=k+1;}int max=0;for (i=0; i<n; i++)if (b[i]>max) max=b[i];return max;
} int cmp(stick a, stick b)
{ if(a.l == b.l) return a.w < b.w; else if (a.l < b.l) return true;return false;
} int main()
{ stick data[maxN];int i,k; int test; scanf("%d", &test); for(k = 0; k < test; ++k) { int n; scanf("%d", &n); for(i = 0; i < n; ++i) scanf("%d%d", &data[i].l, &data[i].w); sort(data, data+n, cmp);printf("%d\n", LIS(n, data)); } return 0;
}

【贪心算法】Wooden Sticks(资源调度问题)相关推荐

  1. 最小延迟调度问题算法c语言,【算法概论】贪心算法:最小延迟调度问题

    最小延迟调度问题 Scheduling to Mnimizing Lateness 问题描述: 假定有一单个的资源在一个时刻只能处理一个任务.现给定一组任务,其中的每个任务 i 包含一个持续时间 ti ...

  2. 贪心算法下的两大经典问题:最优装载问题、最小延迟调度问题

    上一篇主要介绍了贪心算法的内容和活动选择问题.本篇主要介绍最优装载问题和最小延迟调度问题 1.最优装载问题 什么是最优装载问题 类似于0-1背包问题那样,有n个集装箱1,2,-,n装上轮船,集装箱i的 ...

  3. 4.贪心算法 含例题

    文章目录 贪心算法 一.一个基本的贪心算法问题:区间调度问题 二.区间调度的推广:多个资源下的贪心算法 三.最小延迟调度--交换论证 四.最优超高速缓存问题 五.图最短路径问题 六.最小生成树问题 七 ...

  4. 【算法学习】贪心算法

    参考算导第三版第16章 贪心算法 文章目录 1. 活动选择问题 1.1 活动选择问题的最优子结构 1.2 贪心选择 1.3 递归贪心算法 1.4 迭代贪心算法 2. 贪心算法原理 2.1 贪心选择性质 ...

  5. 算法导论-上课笔记7:贪心算法

    文章目录 0 前言 1 活动选择问题 1.1 活动选择问题的最优子结构 1.2 贪心选择 1.3 递归贪心算法 1.4 迭代贪心算法 2 贪心算法原理 2.1 贪心选择性质 2.2 最优子结构 2.3 ...

  6. 一份贪心算法区间调度问题解法攻略,拿走不谢

    作者 | labuladong 来源 | labuladong(ID:labuladong) [导读]什么是贪心算法呢?贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多 ...

  7. 贪心算法区间调度问题思路代码证明

    1.活动安排问题 问题:有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 解题思路:将活动按照结束时间进行从小到大排序,挑选出结束时间尽量 ...

  8. java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)

    一.贪心算法 定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化. 二.区间调度问题 1. 问题:我们有一组需求{1,2,3 ...

  9. 最小延迟调度问题——贪心算法(C++实现)

    1.最小延迟调度问题描述 f(i) 表示某任务 开始的时间.ti 表示 某任务 加工的时间di 表示 某任务 要求完成的时间延迟: f(i)+ti-di 如果 实际完成的时间 小于 规定完成时间,那么 ...

  10. java调度问题的贪心算法_java代码,多机调度问题,怎么解释

    展开全部 多机调度问题的Java实现(贪心算法) 具体问题描述以及C/C++实现参见网址e68a843231313335323631343130323136353331333361323564[jav ...

最新文章

  1. Android--面试题整理(二)
  2. JAVA——改变观感
  3. linux测试怎样看,linux入门篇:如何查看centos版本
  4. 2019手卫生定义_2021年卫生资格考试部分科目大纲和教材变化归总!
  5. 实战之十一 windows 2008 r2 AD 备份和还原(上)-非授权还原
  6. https://www.npmjs.com/package/lifecycle-webpack-plugin
  7. win10 iot core java_Windows 10 IoT Core开发环境
  8. win7下安装tomcat
  9. php dfa,DFA 算法的PHP实现
  10. Layui表格刷新(重载)
  11. SSD容量也不宜小,最好1T往上
  12. 汽车CAN总线关闭故障的诊断与恢复
  13. 芯洲 DCDC SCT2433STER参数可以P2P替代TPS5430DDAR,3.8V-40V输入,3.5A,低静态电流同步降压DCDC转换器
  14. 2021年苹果手机绕ID解锁教程-附使用工具
  15. Unity PlayerSetting Android打包设置介绍
  16. SQL -- 触发器(详细)
  17. pandas读取xlsx文件
  18. TheChroniclesOfNarnia写作年代
  19. VSCode配置Python教程
  20. 蚂蚁IPO有人欢呼,也有前员工建群,​群名“错失几千万的人”

热门文章

  1. 王禹偁:万壑有声含晚籁,数峰无语立斜阳
  2. 哈尔滨工业大学计算机科学与技术学院许博文,王轩-哈尔滨工业大学(深圳)计算机科学与技术学院...
  3. 百度商桥修改服务器,百度商桥在线客服设置的操作步骤
  4. pantompkins matlab,Matlab对Python的findpeaks算法
  5. java网易云信怎么用_网易云信 SDK
  6. HTML5大前端开发有哪些常用工具?
  7. 如何用python写脚本_python写脚本
  8. Arctime——可视化字幕编辑器,解放你的双手
  9. 2021-11-17每日刷题打卡
  10. 基于ARM裸机的知识点总结(9)------基于S5PV210的定时器、看门狗和RTC