HDU 1051 Wooden Sticks
题意:
有 n 根木棒,长度和质量都已经知道,需要一个机器一根一根地处理这些木棒。
该机器在加工过程中需要一定的准备时间,是用于清洗机器,调整工具和模板的。
机器需要的准备时间如下:
1.第一根需要1min的准备时间;
2.在加工了一根长为 l ,重为 w 的木棒后,接着加工一根长为 l’(l <= l’),重为 w’
(w <= w’)的木棒是不需要任何准备时间的,否则需要1min时间。
求加工 n 根木棒所用的最少时间。例如现有长和重分别为(4,9),(5,2),(2,1),(3,5)和(1,4)
的5根木棒,那么所需的最少时间为2min,顺序为(1,4),(3,5),(4,9),(2,1),(5,2);
分析:
属于资源调度问题,贪心算法能获得很好的效率。
但仅用贪心还是不够的,排序后还要用动态规划
方法一:
排序后求上升子序列的最少组数,这个组数即最少时间。
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct mu
{
int L,W;
} m[];
bool cmp(mu a, mu b)
{
if(a.L == b.L) //优先按长度排序,相等时按重量
return a.W < b.W;
else
return a.L < b.L;
}
int main()
{
int t;
int b[]; //记录第 i 个木棒的分组序号
cin >>t;
while(t--)
{
memset(b, , sizeof(b));
int n;
cin >>n;
for(int i = ; i < n; i ++)
scanf("%d%d", &m[i].L, &m[i].W);
sort(m, m + n, cmp);
b[] = ; //第一个分为第一组
for(int i = ; i < n; i ++) //依次为后面的木棒分组
{
int k = ;
for(int j = ; j < i; j ++) //在当前木棒前面的木棒中找到比它沉且组数为最大的
if(m[i].W < m[j].W && k < b[j])
k = b[j];
b[i] = k + ; //当前木棒分为第 k + 1 组
}
int ma = ;
for(int i = ; i < n; i ++) //最大组数即最少时间
if(b[i] > ma)
ma = b[i];
cout <<ma <<endl;
}
return ;
}
方法二:
分组,只记录每组第一个,标记为0,其余的标记为1.
代码如下:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
struct mu
{
int l, w;
} m[];
bool cmp(mu a, mu b)
{
if(a.l == b.l)
return a.w < b.w;
else
return a.l < b.l;
}
int main()
{
int t, n;
int b[];
cin >>t;
while(t --)
{
memset(b, , sizeof(b));
scanf("%d", &n);
for(int i = ; i < n; i ++)
scanf("%d%d", &m[i].l, &m[i].w);
sort(m, m + n, cmp);
for(int i = ; i < n; i ++)
{
if(b[i] == )
continue; //已分组,看下一个
int k = m[i].w; //本组第一个
for(int j = i + ; j < n; j ++)
{
if(b[j] == )
continue;
if(m[j].w >= k) //后面升序的都归为本组
{
k = m[j].w;
b[j] = ;
}
}
}
int cnt = ;
for(int i = ; i < n; i ++)
if(b[i] == )
cnt ++;
printf("%d\n", cnt);
}
return ;
}
HDU 1051 Wooden Sticks的更多相关文章
- HDU 1051 Wooden Sticks (贪心)
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDU 1051 Wooden Sticks 贪心||DP
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDU - 1051 Wooden Sticks 贪心 动态规划
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- hdu 1051:Wooden Sticks(水题,贪心)
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDU 1051 Wooden Sticks【LIS】
题意:给出n个木头的重量wi,长度li,如果满足w[i+1]>=w[i]且l[i+1]>=l[i],则不用耗费另外的加工时间,问至少需要多长时间加工完这些木头. 第一次做这一题目也没有做出 ...
- HDU 1051 Wooden Sticks 造木棍【贪心】
题目链接>>> 转载于:https://www.cnblogs.com/Action-/archive/2012/07/03/2574800.html 题目大意: 给n根木棍的长度 ...
- HDU 1051 Wooden Sticks 贪心题解
本题一看就知道是最长不减序列了,一想就以为是使用dp攻克了. 只是那是个错误的思路. 我就动了半天没动出来.然后看了看别人是能够使用dp的,只是那个比較难证明其正确性,而其速度也不快.故此并非非常好的 ...
- hdu 1051 wooden sticks (贪心+巧妙转化)
#include <iostream>#include<stdio.h>#include<cmath>#include<algorithm>using ...
- HDOJ 1051. Wooden Sticks 贪心 结构体排序
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
随机推荐
- 使用Carthage管理iOS依赖库
Carthage安装和使用和CocoaPods类似: 1.安装: 终端执行以下命令: $ brew update $ brew install carthage 查看Carthage的版本号: $ c ...
- 程序中保存状态的方式之ViewState
程序中保存状态的方式有以下几种: 1.Application 2.Cookie 3.Session 4.ViewState:ViewState是保存状态的方式之一,ViewState实际就是一个Hid ...
- C# 将文件嵌入DLL 。Log4net 配置
最近在弄使用Log4net记录日志. 将配置文件封装到的DLL中. 封装步骤: 1.将配置文件添加到类库中. 2.在配置文件上右键,选择属性. 3. 此时生成类库.DLL中就存在该配置文件啦.如图: ...
- Trie / Radix Tree / Suffix Tree
Trie (字典树) "A", "to", "tea", "ted", "ten", "i ...
- SVN 集中式版本控制软件
简介: 目前流行的版本控制软件中,SVN ( 集中式版本控制 ) 算是使用范围更广.且使用时间更早的一款了,现在 git ( 分布式版本控制 ) 更火爆一点. 一.安装svn [root@localh ...
- python模拟登陆知乎并爬取数据
一些废话 看了一眼上一篇日志的时间 已然是5个月前的事情了 不禁感叹光阴荏苒其实就是我懒 几周前心血来潮想到用爬虫爬些东西 于是先后先重写了以前写过的求绩点代码 爬了草榴贴图,妹子图网,后来想爬婚恋网 ...
- pxe无人值守安装多网卡注意事项
pxe无人值守安装linux配置这里就不说了,直接看这篇博客http://www.cnblogs.com/mchina/p/centos-pxe-kickstart-auto-install-os.h ...
- libxml2 移植 arm9
准备工作: 1.libxml2软件版本:libxml2-2.6.32.tar.gz 2.交叉编译工具链:arm-none-linux-guneabi 软件安装: 1.设置环境变量: export PA ...
- MJPhotoBrowser BUG修复
崩溃在loading.progress = (float)receivedSize/expectedSize; 分析:MJPhotoView 执行了hide移除了MJPhotoLoadingView, ...
- JAVA XML
为什么要用XML:1各平台之间程序很难直接交流 2各程序之间交换数据 xml定义 可扩展标记语言,标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言. 它可以用来标记数据.定义数据 ...