HDOJ 1051 Wooden Sticks(贪心)

Wooden Sticks

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


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
 

Source
Asia 2001, Taejon (South Korea)
 

Recommend
We have carefully selected several similar problems for you:   1050  1052  1045  1053  1789

思路:
此题数据好像链条,拿测试数据 6       4 9 5 2 2 1 3 5 1 4 5 7 来说:前者为 L,后者为 W,对 L 结构体二重排序,得到 L 是有序的,W无序,即(L , W) (1,4)(2,1)(3,5)(4,9)(5,2)(7,1),再比较前后两个的 W。如 1<4,  1就不在以4为起点的链条内,5>=4 , 5在以4为起点的链条内, 9>=4, 9在以4为起点的链条内。。。。最后
以W=4为起点的链条内的有(1,4)( 3, 5) ( 4, 9)...在以W=1为起点的链条内的有(2,1)(5,2)...以W=7为起点的链条内的有(7,1)。有三条链,于是sum=3。

又一组测试数据:
5
4
8 32 31 21 6 2 9 7 
3 
11 11 11 11 11 11 
3 
12 123 12 122 12 123
5
5 6 5 7 7 6 7 7 2 2
5
2 2 5 6 5 7 7 6 7 7
答案
2
1
1
2
2

 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct wood{
	int l;
	int w;
}woo[5200];//开数组不能过小
int cmp(const void *a,const void *b){
    if((*(wood *)a).l!=(*(wood *)b).l)
	return (*(wood *)a).l-(*(wood *)b).l;
	else return (*(wood *)a).w-(*(wood *)b).w;
}//对L升序排序,若相等,对W排序
int main(){
	int n,m,i,k,sum,t;
	scanf("%d",&n);
	while(n--){
		memset(woo,0,sizeof(woo));//初始化数组woo
		scanf("%d",&m);
		for(i=0;i<m;i++)
			scanf("%d%d",&woo[i].l,&woo[i].w);
		qsort(woo,m,sizeof(woo[0]),cmp);
		t=0;  sum=0;
		while(t!=m){//将已进入链条的数置-1,t表示有t个数据已置-1
            for(k=0;k<m&&woo[k].w==-1;k++);//记录第一个不为-1的数据
            for(i=k+1;i<m;i++){
                if(woo[i].w!=-1)//从第一个不为-1的数据的下一个不为-1的数据开始
                    if(woo[i].w>=woo[k].w){//若第i个数能进入此链条
                        woo[k].w=-1; t++;  //将第k个数置-1,第i个还要与下一个比较,计数器t++
                        k=i;//换标记
                    }
            }// for
            woo[k].w=-1;//最后一个进入链条的数还没置-1
            t++;//同样加
            sum++;//一条链条结束,计数器加1
		}//while
        printf("%d\n",sum);
	}
	return 0;
}


你可能感兴趣的:(贪心,hdoj)