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 ...
随机推荐
- Struts2理解--动态方法和method属性及通配符_默认Action
众所周知,默认条件下,在浏览器输入indexAction!execute.action,便会执行indexAction类里的execute方法,这样虽然方便,但可能带来安全隐患,通过url可以执行Ac ...
- 总结A*,Dijkstra,广度优先搜索,深度优先搜索的复杂度比较
广度优先搜索(BFS) 1.将头结点放入队列Q中 2.while Q!=空 u出队 遍历u的邻接表中的每个节点v 将v插入队列中 当使用无向图的邻接表时,复杂度为O(V^2) 当使用有向图的邻接表时, ...
- JS-小球碰撞反弹
类似于屏保的一种动画,当小球碰到边框时,发生反弹,并且变化颜色. <!DOCTYPE html><html lang="en"><head> ...
- Java Calendar 类的时间操作
Java Calendar 类的时间操作 标签: javaCalendar时间Date 2013-07-30 17:53 140401人阅读 评论(7) 收藏 举报 分类: 所有(165) Java ...
- Qt 程序访问 sqlite 权限错误
在Linux桌面上开发应用,想要拥有root权限,可是又需要弹窗申请.所以尽量避免这种情况发生. 另外:gksu,pkexec可以提供gui的root权限索取功能. 因为db文件是安装的时候放到etc ...
- Jquery基础知识
//使用$操作得到的对象,都是Jquery对象 如何把Jquery对象转换成dom对象?$abc 方法1:var div = $div.get(0) 方法2:var div = $div[0] 如何把 ...
- AndroidLinker与SO加壳技术之下篇
点此查看上篇<AndroidLinker与SO加壳技术之上篇> 2.4 链接 链接过程由 soinfo_link_image 函数完成,主要可以分为四个主要步骤: 1. 定位 dynami ...
- js设置本周 本月 本年
var SetSearchDate = function (sign, sid, eid) {//sign 标识符区分本周本月本年,sid开始时间id,eid结束时间id var now = new ...
- Hibernate配置与事务管理
数据库中 @num:代表一个变量 Set @num = 10; Select @num+@num from dual; dual:临时表 得到结果 20 Hibernate:运用数据持久化,使用OR ...
- .net中从GridView中导出数据到excel(详细)
1,创建数据源 找到要导出的GridView中的数据. 2,重写VerifyRenderingInServerForm方法. public override void VerifyRenderingI ...