hdu 1051 Wooden Sticks - 贪心

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

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

 

题意:

有很多小木棒,第i根的长度和质量分别为li,wi。今要对小木棒进行加工。加工的第一根木棒的时间为1分钟。在之后的木棒中,正在加工的木棒的l',w'与前一个加工的木棒的l,w比,如果 l<=l'  w<=w'就不花时间,否则花一分钟。让你求最少的时间。

 

思路:

这题要用贪心法,先对所有木棒的l或w进行排序并全部标记为0,然后从第一根木棒进行检索,找到符合 l<=l'  w<=w'的木棒并标记为1,检索完一遍以后又从第一个标记为0的木棒开始检索,直到全部标记为1。

 

源代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 
 5 struct wood
 6 {
 7     int l;
 8     int w;
 9     int flag;
10 };
11 struct wood a[5000+10];
12 struct wood b[5000+10];
13 
14 int main()
15 {
16    int t,m,n,i,j,temp,time,count,sum;
17    struct wood head;
18    scanf("%d",&t);
19    while(t--)
20    {
21        scanf("%d",&n);
22        for(i=0;i<n;i++)
23        {
24            scanf("%d %d",&a[i].l,&a[i].w);
25            a[i].flag=0;
26        }
27        for(i=0;i<n;i++)
28        {
29         for(j=i+1;j<n;j++)
30         {
31             if(a[i].l>a[j].l||(a[i].l==a[j].l&&a[i].w>a[j].w))
32             {
33              temp=a[i].l;
34              a[i].l=a[j].l;
35              a[j].l=temp;
36              temp=a[i].w;
37              a[i].w=a[j].w;
38              a[j].w=temp;
39             }
40         }
41        }
42         time=0;
43         head.l=a[0].l;
44         head.w=a[0].w;
45         a[0].flag=1;
46         sum=1;
47         do{
48            for(i=1;i<n;i++)
49            {
50             if(a[i].flag==0&&head.l<=a[i].l&&head.w<=a[i].w)
51             {a[i].flag=1;
52              head.l=a[i].l;
53              head.w=a[i].w;
54              sum++;}
55            }
56 
57            time++;
58            for(i=0;i<n;i++)
59           {
60            if(a[i].flag==0)
61             {
62               head.l=a[i].l;
63               head.w=a[i].w;
64               break;
65             }
66           }
67          }while(sum!=n);
68 
69 
70          printf("%d\n",time);
71 
72    }
73     return 0;
74 }

 

posted @ 2013-08-06 00:14  小の泽  阅读(185)  评论(0编辑  收藏  举报