hdu1051 Wooden Sticks(LIS动态规划or贪心)
来源:互联网 发布:python的print不换行 编辑:程序博客网 时间:2024/06/07 03:41
Wooden Sticks
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 18663 Accepted Submission(s): 7640
Problem 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 woodworking machine in one by one fashion. It needs some time, called setup time, for the machine to prepare processing a stick. The setup times are associated with cleaning operations and changing tools and shapes in the machine. The setup times of the woodworking machine are given as follows:
(a) The setup time for the first wooden stick is 1 minute.
(b) Right after processing a stick of length l and weight w , the machine will need no setup time for a stick of length l' and weight w' if l<=l' and w<=w'. Otherwise, it will need 1 minute for setup.
You are to find the minimum setup time to process a given pile of n wooden sticks. For example, if you have five sticks whose pairs of length and weight are (4,9), (5,2), (2,1), (3,5), and (1,4), then the minimum setup time should be 2 minutes since there is a sequence of pairs (1,4), (3,5), (4,9), (2,1), (5,2).
(a) The setup time for the first wooden stick is 1 minute.
(b) Right after processing a stick of length l and weight w , the machine will need no setup time for a stick of length l' and weight w' if l<=l' and w<=w'. Otherwise, it will need 1 minute for setup.
You are to find the minimum setup time to process a given pile of n wooden sticks. For example, if you have five sticks whose pairs of length and weight are (4,9), (5,2), (2,1), (3,5), and (1,4), then the minimum setup time should be 2 minutes since there is a sequence of pairs (1,4), (3,5), (4,9), (2,1), (5,2).
Input
The input consists of T test cases. The number of test cases (T) is given in the first line of the input file. Each test case consists of two lines: The first line has an integer n , 1<=n<=5000, that represents the number of wooden sticks in the test case, and the second line contains n 2 positive integers l1, w1, l2, w2, ..., ln, wn, each of magnitude at most 10000 , where li and wi are the length and weight of the i th wooden stick, respectively. The 2n integers are delimited by one or more spaces.
Output
The output should contain the minimum setup time in minutes, one per line.
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
213
题意是:将木棍放在机器里处理,第一根需要一分钟,剩余的如果大于等于前边放入的长度和重量,就不用费时间,否则需要一分钟,计算给出一组数的最少时间!
一.dp
先对木棍进行排序,先按长度从小到大,长度相同,再按重量从小到大,排序之后,可以知道第i根木棍总不比第i-1根短,只是就只需要考虑重量就行,如果j根木棍比j-1根长,就可得需要另开多花费一分钟, dp[i]=dp[j]+1就行,最后求的1-n中dp[i]的最大值
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct st { int l,w; }a[5010]; int dp[5010]; int cmp(st x,st y) { if(x.l!=y.l) return x.l<y.l;//按照筷子的长度递增排序,判断筷子的重量是否是递增的,若递增满足题意,否则+1; else return x.w<y.w; } int main() { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&a[i].l,&a[i].w); dp[i]=1; } sort(a,a+n,cmp); for(int i=1;i<n;i++) { for(int j=0;j<i;j++) { if(a[j].w>a[i].w&&dp[i]<dp[j]+1)//若满足dp[i]<dp[j]+1表示i和j在相同的序列中 // 若在相同的序列中dp[i]就要+1; { dp[i]=dp[j]+1; } } } int maxn=0; for(int i=0;i<n;i++) { if(dp[i]>maxn) maxn=dp[i]; } printf("%d\n",maxn); } return 0; }
二 贪心
基本和dp差不多,也是用序列来完成,排序之后就只看重量了,如果后者比前者大,更新较大数,反之再开一个新序列
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct st{int l,w;}a[5005];int s[5005]; bool cmp(st a,st b)//排序 {if(a.l!=b.l) return a.l<b.l;else return a.w<b.w;}int main(){int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d%d",&a[i].l,&a[i].w);s[i]=1;}sort(a,a+n,cmp);int exist=1; s[0]=a[0].w;for(int i=1;i<n;i++){int flag=1;for(int j=0;j<exist;j++){if(s[j]<=a[i].w){flag=0;s[j]=a[i].w;break;} }if(flag) //前面所有重量大于当前重量,再开一个序列 s[exist++]=a[i].w;}printf("%d\n",exist);}return 0;}
0 0
- hdu1051 Wooden Sticks(LIS动态规划or贪心)
- Wooden Sticks(hdu1051,LIS)
- HDU:1051 Wooden Sticks(贪心+动态规划DP||LIS?)
- HDU1051 Wooden Sticks(贪心)
- hdu1051 Wooden sticks (贪心)
- HDU1051 Wooden Sticks(贪心)
- hdu1051(Wooden Sticks 贪心)
- hdu1051 Wooden Sticks (贪心)
- HDU1051 Wooden Sticks 贪心
- hdu1051 Wooden Sticks贪心
- HDU1051 Wooden Sticks 【贪心】
- HDU1051 Wooden Sticks 贪心
- HDU1051 Wooden Sticks【贪心】
- hdu1051 Wooden Sticks(贪心动规)
- Wooden Sticks hdu1051 贪心算法
- HDU1051(Wooden Sticks)
- 【HDU】1051 - Wooden Sticks(贪心 & 二分 || 动态规划)
- zoj 1025 Wooden Sticks 贪心 + 动态规划
- word2vec的使用参数解释和应用场景
- Android开发之WebView详解
- sublime text3的强大插件emmet介绍
- javascript_lesson5_面向对象程序设计
- install matlab2016a for linux(unbuntu)
- hdu1051 Wooden Sticks(LIS动态规划or贪心)
- volley-retrofit-okhttp之我们该如何选择网路框架
- C#中常用的几种读取XML文件的方法
- 【short dump】DBIF_RSQL_INVALID_RSQL
- [Widget]BaseTabStrip-用于捆绑ViewPager实现复杂页面切换效果的TabStrip的基类
- Codeforces Round #367 (Div. 2) C. Hard problem (dp)
- Docker集中化web界面管理平台shipyard
- 最大子段和
- 谷歌浏览器自动打印并关闭当前页