hdu 1051 Wooden Sticks

来源:互联网 发布:ionic lab for mac 编辑:程序博客网 时间:2024/06/05 10:07

http://acm.hdu.edu.cn/showproblem.php?pid=1051


Wooden Sticks

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 21495    Accepted Submission(s): 8668


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
213

题目大意:有一个机器可以加工一些木棒,每个木棒都有长度和重量,加工第一个木棒需要1分钟,加工后一个个木棒时如果后一个木棒的长和重量都小于等于前一个,那么不需要加工时间但是要更新长度和重量,否则时间需要一分钟并更新长度和重量。

题目分析:以木棒的长度和重量降序排列将第一个木棒标记,其他木棒依次与第一个木棒的长和重比较,如果满足条件,更新长和重,直到有一个不满足条件,时间加1,在从前面找到第一个未标记的继续前面的比较,直到全部木棒都被标记。

#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;struct point{int x,y;};int cmp(point a,point b){if(a.x==b.x)return a.y>b.y;return a.x>b.x;}int main(){int i,j,T,n,sum,b[100008];int l,k;struct point a[100008];scanf("%d",&T);while(T--){memset(b,0,sizeof(b));sum=0;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d%d",&a[i].x,&a[i].y);sort(a,a+n,cmp);for(i=0;i<n;i++){if(b[i]==0){l=a[i].x;k=a[i].y;b[i]=1;for(j=i+1;j<n;j++){if(b[j]==0 && a[j].x<=l && a[j].y<=k){l=a[j].x;k=a[j].y;b[j]=1;}}sum++;}}printf("%d\n",sum);}return 0;}