HDU 1051 Wooden Sticks【LIS】

题意:给出n个木头的重量wi,长度li,如果满足w[i+1]>=w[i]且l[i+1]>=l[i],则不用耗费另外的加工时间,问至少需要多长时间加工完这些木头。

第一次做这一题目也没有做出来---而且也是好久以前---于是又看题解了---

发现和将木材按两个关键字(先按重量由大到小排,如果重量相等的话则按长度由大到小排)排序后,和导弹拦截系统是一样的了,求长度的最长上升子序列。

自己写的二分查找一直输不出结果----555555

后来用了题解里面的lower_bound函数

搜了一点lower_bound的用法

和二分查找类似,lower_bound是将一个数a插入到给定的序列[first,end)中第一个不小于a的位置, 如果该序列中所有的数都小于a,那么返回end,a插入到end位置上

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define maxn 100005
 6 using namespace std;
 7 struct node
 8 {
 9     int l,r;
10 } a[maxn];
11 int cmp(node n1,node n2)
12 {
13     if(n1.l!=n2.l) return n1.l>n2.l;
14     return n1.r>n2.r;
15 }
16
17 int main()
18 {
19     int ncase,n,i,j,len,tmp,f[maxn];
20     scanf("%d",&ncase);
21     while(ncase--)
22     {
23         scanf("%d",&n);
24         for(i=1;i<=n;i++)
25         scanf("%d %d",&a[i].l,&a[i].r);
26         sort(a+1,a+n+1,cmp);
27         len=1;
28         f[len]=a[1].r;
29         for(i=2;i<=n;i++)
30         {
31             if(a[i].r>f[len])
32             {
33                 len++;
34                 f[len]=a[i].r;
35             }
36             else
37             {
38                 tmp=lower_bound(f+1,f+1+len,a[i].r)-f;
39                 f[tmp]=a[i].r;
40             }
41         }
42         printf("%d\n",len);
43     }
44 }

时间: 2024-10-12 22:46:20

HDU 1051 Wooden Sticks【LIS】的相关文章

HDU 1051 Wooden Sticks【贪心+排序】

/* 中文题目 木头 中文翻译-大意 加工第一个木头要调试机器,所以要一分钟,后面的木头在长度和重量上都要大于等于前一个木头,才不要调试机器,否则要调试机器,再花费一分钟 解题思路:先将木头的长度按升序排序,后面质量发生冲突的地方就要在之后重新安排一下 解题人:lingnichong 解题时间:2014-10-25 16:33:10 解题体会:一个括号的丢失,就导致错了一大片 */ Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    M

HDU1051 Wooden Sticks 【贪心】

Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11627    Accepted Submission(s): 4807 Problem Description There is a pile of n wooden sticks. The length and weight of each stick a

HDU 1051 Wooden Sticks 贪心||DP

Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 22000    Accepted Submission(s): 8851 Problem Description There is a pile of n wooden sticks. The length and weight of each stick ar

HDU 1051 Wooden Sticks (贪心)

Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11249    Accepted Submission(s): 4629 Problem Description There is a pile of n wooden sticks. The length and weight of each stick a

【贪心专题】HDU 1051 Wooden Sticks (切割木棍)

链接:click here~~ 题目大意: 给n根木棍的长度和重量.根据要求求出制作木棍的最短时间.建立第一个木棍需要1分钟,若是接着要制作的木棍重量和长度都比此木棍长就不需要建立的时间,若是没有,则再需要建立时间.求时间最小为多少. [解题思路] 对木棍的长度和重量进行排序,以长度为首要考虑(也可以先考虑重量). 于是,我们对排序后的数组进行多次扫描,在一次建立时间内完成的进行标记,直到木棍全部标记(设置一个外部变量来计数已扫描的元素的数量) 举个别人的例子,加深理解 5 4 9  5 2 2

HDU1051 Wooden Sticks【贪心】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1051 题目大意: 有N根木棍,每根木棍的长度和质量是已知的,机器要处理这N根木棍,处理时间和木棍的长度和 权重有关.第一根木棍的处理时间为1min,之后处理的木棍如果长度大于等于前一根木棍的长度 并且权重也大于等于前一根木棍的长度,就不需要处理时间:否则就需要1min的处理时间.问: 最小的处理时间为多少. 思路: 贪心思想.先将木棍按长度从小到大排列,如果长度一致,则按权重从小到大排列.然后根据

POJ 1065 Wooden Sticks【贪心】

题意: 有一些木棍,每个有长度和重量,要求把这些木棍排成若干两个属性值均不下降的序列.问至少要分为多少个序列.且要保证排出来的子序列数最少. 思路: ( 9 , 4 ) ,( 2 , 5 ) ,( 1 , 2 ) ,( 5 , 3 ),( 4 , 1 )可以排成这样 ( 4 , 1 ) , ( 5 , 3 ) , ( 9 , 4 );   ( 1 , 2 ) , ( 2 , 5 ) . 其中:(4,1)<=(5,3)<=(9,4)为不降序列,(4,1)<(5,3)由于4<5&

HDU 1051 - Wooden Sticks

贪心吧 保证一维非递减的情况下,计算另一维上最少有几个非递减序列,就是答案 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 using namespace std; 5 int t,n; 6 struct P{ 7 int l,w; 8 }s[5005]; 9 bool cmp(P a,P b) 10 { 11 return a.l==b.l?a.w<b.w : a.l<b

贪心/hdu 1051 Wooden Sticks

#include<cstdio> #include<algorithm> #include<cstring> using namespace std; struct node { int l,w; bool v; }; int n; node a[5010]; bool cmp(node x,node y) { if (x.l==y.l) return x.w<y.w; return x.l<y.l; } int main() { int T; scanf(