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
题意:
有很多小木棒,第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 }