HDU-1051 Wooden Sticks
Wooden Sticks
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3902 Accepted Submission(s): 1621
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).
(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
题义:给定若干(1<= n <=5000)组二维坐标点,凡是满足 "x1<= x2 && y1<= y2"的话那么我们承认这两个坐标是属于同一个集合中。题目要我们求出这些坐标点最少能表示成几个集合。
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).
先将所有的点的信息保存起来,然后选取 x 或者 y 作为对象进行排序,排序中注意如果两个点的 x相同,那么这时候要保持 y有序。这样做的目的是使得所有集合线性的呈现出来,可以理解为经过这样一次排序后,能够每次从前到后找到一个包含点满足题义且最多的点集。不会出现正确分离出来的集合在该排列中有元素是逆序的。
代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int T; struct E { int len, wi; } e[5010]; char hash[5010]; int cmp( const void *a, const void *b ) { if( ( ( struct E * )a )-> len!= ( ( struct E * )b )-> len ) { return ( ( struct E * )a )-> len- ( ( struct E * )b )-> len; } else { return ( ( struct E * )a )-> wi- ( ( struct E * )b )-> wi; } } int find( int N ) { for( int i= 0; i< N; ++i ) { if( !hash[i] ) { return i; } } return -1; } bool ok( int i, int baselen, int basewi ) { if( e[i].wi>= basewi ) { return true; } else { return false; } } int main( ) { scanf( "%d", &T ); while( T-- ) { memset( hash, 0, sizeof( hash ) ); int N, time= 0; scanf( "%d", &N ); for( int i= 0; i< N; ++i ) { scanf( "%d %d", &e[i].len, &e[i].wi ); } qsort( e, N, sizeof( e[0] ), cmp ); int sta; while( 1 ) { sta= find( N ); // printf( "sta=%d\n", sta ); if( sta== -1 ) { break; } int baselen= e[sta].len, basewi= e[sta].wi; // printf( "blen= %d, bwi= %d\n", baselen, basewi ); for( int i= sta; i< N; ++i ) { //printf( "blen= %d, bwi= %d\n", baselen, basewi ); if( !hash[i]&& ok(i, baselen, basewi ) ) { hash[i]= 1; //printf( "..%d ..%d\n", e[i].len, e[i].wi ); baselen= e[i].len; basewi= e[i].wi; } } ++time; } printf( "%d\n", time ); } } /* 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 */