【例题收藏】◇例题·IV◇ Wooden Sticks
◇例题·IV◇ Wooden Sticks
借鉴了一下 Candy? 大佬的思路 +传送门+ (=^-ω-^=)
来源:+POJ 1065+
◆ 题目大意
有n个木棍以及一台处理木棍的机器。第i个木棍用二元组 (li,wi) 表示,li 为它的长度,wi 为它的重量。
机器可以连续处理木棍{a[1],a[2]...a[m]}当且仅当对于每一个i(1≤i<m) la[i]<la[i+1] 且 wa[i]<wa[i+1] 。机器连续处理木棍的时间是1单位。你需要将这些木棍按一定顺序在机器中处理,求最少需要花费多少的时间。
例如:按顺序 ( 4 , 1 ) , ( 5 , 3 ) , ( 9 , 4 ) , ( 1 , 2 ) , ( 2 , 5 ) 处理,花费时间为2。
◆ 解析
这道题对STL的运用非常巧妙(我不知道为什么老师把这道题放在DP里……)
将问题简化一下,其实就是将木棍分成多个不上升序列,求最少序列数。我们不妨将这些序列设为 seq[1~m],那么判断一根木棍能否插入到某一个序列末尾,就是判断它的w和l是否都小于序列的末尾元素。
然后就是一个比较明显的贪心思想:若木棍x可以插入序列i或序列j的末尾,但是i的末尾要大于j的末尾,我们就把x插入i而不是j,这样能够让j插入更多的元素。
接下来就是实现了!
由于求不上升子序列和求不下降子序列是一个道理(?留给reader们思考一下),所以我们可以算最长不下降子序列。还有一个麻烦就是木棍是二元组,同时考虑两个值很麻烦,所以我们可以先sort一遍,按w为关键字(l为第二关键字),这样保证插入时w的这一维是不下降的。然后我们就只需要考虑 l 这一维。
由于我们只需要用到每一个不下降序列的末尾元素,我们可以定seq[i]表示第i个不下降序列的末尾元素。一开始所有序列seq都是空,而我们要使第一根木棍一定能够插入到序列中,我们就可以把序列末尾全部清空为负无穷。
然后就是STL的lower_bound()了——找到小于等于特定值的最大元素第一次出现的位置。插入 i 时,我们在序列末尾seq中查找小于等于 木棍i的l 的最大的序列末尾,然后插入该序列(贪心)。
◆ 源代码
/*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=,INF=int(1e9);
struct WOOD{
int w,l;
}wood[MAXN+];
int n;
int seq[MAXN+]; //seq[i]表示第i组连续处理的木棍最后处理的木棍的l
bool cmp(int a,int b){return a>b;}
bool cmp_(WOOD A,WOOD B) //按w为第一关键字排序,l为第二关键字
{
if(A.w>B.w) return ; //较小的放前面
if(A.w<B.w) return ;
return A.l<B.l;
}
int Solve()
{
int ans=;
sort(wood+,wood++n,cmp_); //先排序,排序后wood按w形成升序
fill(seq,seq+MAXN+,-INF); //初始化,这样第一根木棍无论如何都可以插入到seq中
for(int i=;i<=n;i++)
{
int pos=lower_bound(seq+,seq++n,wood[i].l,cmp)-seq; //找到最大的可以继续连续处理木棍的组数
seq[pos]=wood[i].l; //更新最后处理的l
ans=max(ans,pos); //处理答案
}
return ans;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d",&wood[i].w,&wood[i].l);
printf("%d\n",Solve());
}
return ;
}
The End
Thanks for reading!
- Lucky_Glass
【例题收藏】◇例题·IV◇ Wooden Sticks的更多相关文章
- Hdu1051 Wooden Sticks 2017-03-11 23:30 62人阅读 评论(0) 收藏
Wooden Sticks Problem Description There is a pile of n wooden sticks. The length and weight of each ...
- HDOJ 1051. Wooden Sticks 贪心 结构体排序
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- POJ 1065 Wooden Sticks
Wooden Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16262 Accepted: 6748 Descri ...
- HDU ACM 1051/ POJ 1065 Wooden Sticks
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 1051 Wooden Sticks
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- Wooden Sticks
Wooden Sticks Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total ...
- C - Wooden Sticks
C - Wooden Sticks Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 1051 Wooden Sticks (贪心)
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- uvalive 2322 Wooden Sticks(贪心)
题目连接:2322 Wooden Sticks 题目大意:给出要求切的n个小木棍 , 每个小木棍有长度和重量,因为当要切的长度和重量分别大于前面一个的长度和重量的时候可以不用调整大木棍直接切割, 否则 ...
随机推荐
- 微信web开发者工具 && 微信调试页面
微信开发者工具 做微信公众号的过程中,自然避免不了登录账号然后进行调试,但是在chrome上我们没有办法登录,这是一个令人头疼的问题,比如这个公众号网页,只会提示出错,因为开发者限制了公众号网页的登录 ...
- SmartRF Flash Programmer突然打不开显示界面的办法【亲测有效】
在尝试打开任务管理器结束任务之后重新打开依然无果,在尝试了SmartRF Flash Programmer卸载重装无数次之后依然无果的况状,我被SmartRF Flash Programmer存在界面 ...
- php 关于时间的函数
//返回1970年1月1日零点以来的秒数. //定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数. time(); ...
- linux内核态和用户态小结
一 内核态和用户态的区别 当进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核状态.此时处理器处于特权级最高的(0级)内核代码.当进程处于内核态时,执行的内核代码会使用当前的内核栈.每个进程 ...
- js获取省市
前台代码 @{ IList<Provinces> allProvinces = ViewBag.AllProvinces; IList<Districts> allDistri ...
- 计算Sn
求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字. 例如:2+22+222+2222+22222(n=5), 输入 输入两个数.第一个为a ,第二个为n(表示有多少个数相加 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(3)、ArcGIS Runtime SDK概述
1.前言 ArcGIS Runtime SDK是一整套用于构建原生及跨平台的地图应用程序的开发包,包括移动设备的Android.iOS.Windows Phone,针对桌面的.Net.Java.OSX ...
- check_mk插件 redis
/usr/lib/check_mk_agent/plugins/mk_redis #!/bin/bash echo '<<<redis>>>' hosts=$(ne ...
- java中将数组、对象、Map、List转换成JSON数据
如果要将数组.对象.Map.List转换成JSON数据,那我们需要一些jar包: json-lib-2.4-jdk15.jar ezmorph-1.0.6.jar commons-logging.ja ...
- *387. First Unique Character in a String (linkedhashmap + string) debug manunally instead of using leetcode
The ability to debug and overall thinking need to improve Given a string, find the first non-repeati ...