poj -1065 Wooden Sticks (贪心or dp)

http://poj.org/problem?id=1065

题意比较简单,有n跟木棍,事先知道每根木棍的长度和宽度,这些木棍需要送去加工,第一根木棍需要一分钟的生产时间,如果当前木棍的长度跟宽度

都大于前一根木棍,那么这根木棍不需要生产时间,问你最少的生产时间是多少?

首先可以贪心,先按长度 l排序,如果l相同,按宽度w排序。

从i=0开始,每次把接下来的i+1  -  n-1 的没有标记并且长度和宽度大于等于i这根木棍的长度和宽度标记起来。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn = 5010;
 7
 8 struct point
 9 {
10     int l,w;
11     bool operator < (const point &a) const
12     {
13         return l==a.l ? w<a.w : l<a.l;
14     }
15 }p[maxn];
16
17 int mark[maxn];
18
19 int main()
20 {
21     int t,n;
22     scanf("%d",&t);
23     while(t--)
24     {
25         scanf("%d",&n);
26         for(int i=0;i<n;i++)
27         {
28             scanf("%d%d",&p[i].l,&p[i].w);
29         }
30         sort(p,p+n);
31         //for(int i=0;i<n;i++) printf("%d %d\n",p[i].l,p[i].w);
32         int s=0;
33         memset(mark,0,sizeof(mark));
34         for(int i=0;i<n;i++)
35         {
36             int temp=p[i].w;
37             if(!mark[i])
38             {
39                 for(int j=i+1;j<n;j++)
40                 {
41                     if(p[j].w>=temp&&!mark[j])
42                     {
43                         temp=p[j].w;
44                         mark[j]=1;
45                     }
46                 }
47                 s++;
48             }
49         }
50         printf("%d\n",s);
51     }
52     return 0;
53 }

dp:排序跟上面一样,然后就是找 w 的最长下降子序列。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn = 5010;
 7
 8 struct point
 9 {
10     int l,w;
11     bool operator < (const point &a) const
12     {
13         return l==a.l ? w<a.w : l<a.l;
14     }
15 }p[maxn];
16
17 int dp[maxn];
18
19 int main()
20 {
21     int t,n;
22     scanf("%d",&t);
23     while(t--)
24     {
25         scanf("%d",&n);
26         for(int i=0;i<n;i++)
27         {
28             scanf("%d%d",&p[i].l,&p[i].w);
29         }
30         sort(p,p+n);
31         //for(int i=0;i<n;i++) printf("%d %d\n",p[i].l,p[i].w);
32         int ans=0;
33         for(int i=0;i<n;i++) dp[i]=1;
34         for(int i=0;i<n;i++)
35         {
36             for(int j=0;j<i;j++)
37                 if(p[j].w>p[i].w) dp[i]=max(dp[i],dp[j]+1);
38             ans=max(ans,dp[i]);
39         }
40         printf("%d\n",ans);
41     }
42     return 0;
43 }
时间: 2025-01-07 06:33:37

poj -1065 Wooden Sticks (贪心or dp)的相关文章

POJ 1065. Wooden Sticks 贪心 结构体排序

Wooden Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19992   Accepted: 8431 Description There is a pile of n wooden sticks. The length and weight of each stick are known in advance. The sticks are to be processed by a woodworkin

poj 1065 Wooden Sticks 贪心

题目链接:http://poj.org/problem?id=1065 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1051 贪心 先按l升序再按w稳定升序 然后从头扫到尾取可以取的 然后再从头 直到全部取完 一年前第一次写这道题的时候写了两百行Orz 其中有70行归并排序自己手敲 刚刚翻看老代码真是感慨... #include <cstdio> #include <cstdlib> #include <ctime> #

POJ 1065 Wooden Sticks#贪心+qsort用法

(- ̄▽ ̄)-* 这道题用到了cstdlib库的qsort()函数: 用法链接:http://www.cnblogs.com/syxchina/archive/2010/07/29/2197382.html #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> using namespace std; struct s

POJ 1065 Wooden Sticks Greed,DP

排序后贪心或根据第二关键字找最长下降子序列 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include<sstream> #include<cmath>

POJ 1065 Wooden Sticks

POJ 1065 Wooden Sticks n根木材长l_i重w_i,前一根木材大于后一根的话要浪费一分钟准备机器,求最省方案? 我们把问题抽象出来,那就是:把一个数列划分成最少的最长不升子序列 Dilworth定理:对于一个偏序集,最少链划分等于最长反链长度. 这个问题是二元组的最少链划分,那么我们以a[]为关键字大小进行排序,如果a[]中相同就按照b[]排序,根据 Dilworth定理,然后题目就变成了求b[]序列中最长严格下降子序列长度了. 1 #include <iostream>

poj 1065 Wooden Sticks / hdu 1257 最少拦截系统 DP 贪心

参考链接:http://blog.csdn.net/xiaohuan1991/article/details/6956629 (HDU 1257 解题思路一样就不继续讲解) POJ 1065题意:给你n个木块,分别给出其长度和重量,然后要对这些木块进行加工,如果木块1的长度和重量都不大于木块2, 那么这两个木块可以放在一起加工,从而只用花费1个时间单位.问要如何进行加工从而能够花费最少时间单位. 知识点: 偏序集:若一个集合A为偏序集,那么满足:1.任意一个元素X属于集合,那么这个元素X≤X 2

poj 1065 Wooden Sticks 【贪心 新思维】

题目地址:http://poj.org/problem?id=1065 Sample Input 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 Sample Output 2 1 3 题目抽象:给你一个序列,序列的每个元素包含两个值(x,y).现在希望找到最少数目的条件序列.条件序列是这样的:cur.x<=(cur+1).x && cur.y<=(cur+1).y满足条件的序列的最少的数目是多少?代码: 1 #inclu

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 贪心||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