码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1051 并查集+贪心

时间:2014-08-13 21:58:17      阅读:333      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   java   os   io   strong   

Wooden Sticks

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11694    Accepted Submission(s): 4837


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).
 

 

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
2
1
3
 
 
 
题目大意:
给你n个木棒,每个木棒长度为l、重量为w,然后用机器加工木棒,机器加工第一个木棒时间为1,若加工完第i个木棒后,再加工第j个木棒,若l[j]>=l[i]&&w[j]>=w[i]则加工第j个木棒不需要消耗时间。求加工完n条木棒所需要的最短时间。
 
思路:
想做动归题目,看了一下HDU题目分类,但是没想出动归转移方程,用并查集和贪心水了一下就过了。。。= = 。。
这道题很明显使得木棒构成的链最长,一条链就是前面木棒i的l和w都小于等于后面木棒j的l和w, 当链最长的时候,那么链的个数最少,于是花费的时间也最短。怎么使得链最长呢,就需要贪心了,先对l从小到大排序,再按w从小到大排序,然后当第j个木棒的l和w都大于等于第i个木棒的l和w的话就把它们并到一个集合里。最后算一下几个集合即为时间。
 
 
代码:
 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <vector>
 5 #include <iostream>
 6 using namespace std;
 7 #define N 5005
 8 
 9 struct node{
10     int id;
11     int l, w;
12     int flag;
13 }a[N];
14 
15 int father[N];
16 int findroot(int p){
17     int r=p;
18     while(r!=father[r]) r=father[r];
19     return r;
20 }
21 
22 bool cmp(node a,node b){
23     if(a.l==b.l) return a.w<b.w;
24     return a.l<b.l;
25 }
26 
27 main()
28 {
29     int t;
30     int n, i, j, ans, k;
31     cin>>t;
32     while(t--){
33         scanf("%d",&n);
34         for(i=0;i<=n;i++) father[i]=i;
35         k=0;
36         for(i=0;i<n;i++) {
37             scanf("%d %d",&a[i].l,&a[i].w);
38             a[i].id=k++;
39             a[i].flag=0;
40         }
41         sort(a,a+n,cmp);
42         for(i=0;i<n;i++){
43             if(!a[i].flag){
44                 k=i;
45                 for(j=i+1;j<n;j++){
46                 if(!a[j].flag&&a[j].l>=a[k].l&&a[j].w>=a[k].w){
47                     father[a[j].id]=a[k].id;
48                     a[j].flag=1;
49                     k=j;
50                 }
51               }
52             }
53             
54         }
55         ans=0;
56         for(i=0;i<n;i++) {
57             if(findroot(a[i].id)==a[i].id)
58             ans++;
59         }
60         printf("%d\n",ans);
61     }
62 }

 

HDU 1051 并查集+贪心,布布扣,bubuko.com

HDU 1051 并查集+贪心

标签:des   style   blog   color   java   os   io   strong   

原文地址:http://www.cnblogs.com/qq1012662902/p/3910936.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!