1. 程式人生 > >HDOJ1051-Wooden Sticks(貪心)

HDOJ1051-Wooden Sticks(貪心)

sca mit del mac hang urn event ber associate

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

Means:

n對數據,每對包括木棍的長跟質量,只有當一組中木棍的長跟質量都大於這組前一個就可以,問你最少可以分成幾組

Solve:

按照長排序,長相同的按照質量排序,然後對於符合條件的連續幾個歸類到一組就好了

Code:

技術分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define CLR(x , v)  memset(x , v , sizeof(x))
 4 static const int MAXN = 5e3 + 10;
 5 struct Node
 6 {
 7     int x , y;
 8 };
 9 
10 Node data[MAXN];
11 bool vis[MAXN];
12 int n;
13 bool cmp(Node a , Node b)
14 {
15     return a.x == b.x ? a.y < b.y : a.x < b.x;
16 }
17 int main()
18 {
19     int t;
20     scanf("%d" , &t);
21     while(t--)
22     {
23         scanf("%d" , &n);
24         CLR(data , 0);CLR(vis , 0);
25         for(int i = 1 ; i <= n ; ++i)
26         {
27             scanf("%d%d" , &data[i].x , &data[i].y);
28         }
29 
30         sort(data + 1 , data + 1 + n , cmp);
31         int ans = 0;
32         int mx = 0;
33         for(int i = 1 ; i <= n ; ++i)
34         {
35             if(vis[i])
36                 continue;
37             ++ans;
38             mx = data[i].y;
39             vis[i] = 1;
40             for(int j = i + 1 ; j <= n ; ++j)
41             {
42                 if(!vis[j] && data[j].y >= mx)
43                 {
44                     vis[j] = 1;
45                     mx = data[j].y;
46                 }
47             }
48         }
49 
50         printf("%d\n" , ans);
51     }
52 }
View Code

HDOJ1051-Wooden Sticks(貪心)