1. 程式人生 > >Wooden Sticks POJ

Wooden Sticks POJ

Problem:

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 ( 9 , 4 ) , ( 2 , 5 ) , ( 1 , 2 ) , ( 5 , 3 ) , and ( 4 , 1 ) , then the minimum setup time should be 2 minutes since there is a sequence of pairs ( 4 , 1 ) , ( 5 , 3 ) , ( 9 , 4 ) , ( 1 , 2 ) , ( 2 , 5 ) .

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 2n 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

Solution:

Here we use the greedy algorithm

(1)Sort the input array with the first keyword as length and the second keyword as weight. 

(2) A boolean array as long as input array is used to mark whether longer sticks are also heavier than any previous( shorter )sticks. For every element in the input array, an inner loop is created to check if there are any following lighter sticks, if so, it would not be marked ,and would be counted ,checked again in inner loop as a beginning of an sub-array sorted by weight.Otherwise the following stick would be marked as 1 in boolean array , and not checked again in outer loop ,because they belong to sub-array begining with its "head" with a corresbonding 0 in bolean array.

(3) 

Obviously ,First element would be counted, elements as a beginning of an sub-array in (2) would be counted as well. After the outer loop , the number of counted elements is got.

Here is the accepted code:

//#14647925 | qiutingting's solution for [POJ-1065] [Problem H]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<deque>
#include<map>
struct node{
    node(){
        l=0;w=0;
    }
    node(int L,int W){
        l=L;w=W;
    }
    int l,w;
};
bool cmp(node &a,node &b){
    if(a.l==b.l){
        return a.w<b.w;
    }
    return a.l<b.l;
}
using namespace std;
int main(){
    node s[5010];
    bool book[5010];
    int t,n,L,W;
    scanf("%d",&t);
    while(scanf("%d",&n)!=EOF){
        memset(book,0,sizeof(book));

        for(int i=0;i<n;i++){
            scanf("%d%d",&L,&W);
            s[i].l=L;
            s[i].w=W;
        }
        sort(s,s+n,cmp);
        int time=0,m;
        for(int i=0;i<n;i++){
            if(book[i]){
                continue;
            }
            m=s[i].w;
            time++;
            for(int j=0;j<n;j++){
                if(s[j].w>=m&&(!book[j])){
                    m=s[j].w;
                    book[j]=1;
                }
            }
        }
        printf("%d\n",time);
    }
	return 0;
}

Reference

vjudge.net: #14647925 | qiutingting's solution for [POJ-1065] [Problem H]