Wooden Sticks |
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB |
Total submit users: 145, Accepted users: 127 |
Problem 10814 : No special judgement |
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 |
Problem Source |
Asia 2001, Taejon (South Korea) |
注意下当两棵树high相等的时候要对weight进行排序。
code:
1 #include <iostream> 2 #include <iomanip> 3 #include <fstream> 4 #include <sstream> 5 #include <algorithm> 6 #include <string> 7 #include <set> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <list> 12 #include <vector> 13 #include <cstdio> 14 #include <cstdlib> 15 #include <cstring> 16 #include <cmath> 17 #include <ctime> 18 #include <ctype.h> 19 using namespace std; 20 21 struct Tree 22 { 23 int high,weight; 24 }tree[5005]; 25 26 int operator <(const Tree &a,const Tree &b) 27 { 28 if(a.high==b.high) 29 return a.weight>b.weight; 30 else 31 return a.high>b.high; 32 } 33 34 int main() 35 { 36 int t; 37 int i,j; 38 int n; 39 int max; 40 int dp[5200]; 41 while(~scanf("%d",&t)) 42 { 43 while(t--) 44 { 45 max=-1; 46 scanf("%d",&n); 47 for(i=0;i<n;i++) 48 scanf("%d%d",&tree[i].high,&tree[i].weight); 49 sort(tree,tree+n); 50 for(i=0;i<n;i++) 51 dp[i]=1; 52 for(i=1;i<n;i++) 53 for(j=i-1;j>=0;j--) 54 if((tree[i].weight>tree[j].weight)&&dp[i]<dp[j]+1) 55 dp[i]=dp[j]+1; 56 for(i=0;i<n;i++) 57 if(dp[i]>max) 58 max=dp[i]; 59 printf("%d\n",max); 60 } 61 } 62 return 0; 63 }