此题链接
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).
(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
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。
又一组测试数据:
又用sort排序做了一遍,感觉比qsort容易的多:
思路:
此题数据好像链条,拿测试数据 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;
}
又用sort排序做了一遍,感觉比qsort容易的多:
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct wood{
int x,y;
};
int cmp(const wood &a,const wood &b){
if(a.x==b.x)
return a.y<b.y;
else return a.x<b.x;
}
int main(){
int n,m,i,sum,num,real,k;
scanf("%d",&n);
while(n--){
wood wo[5200];
scanf("%d",&m);
for(i=1;i<=m;i++){
scanf("%d%d",&wo[i].x,&wo[i].y);
}
sort(wo,wo+m+1,cmp);//因为加了一个链的开头wo[0],所以wo+m+1多加了1
sum=0; num=0;
wo[0].x=wo[0].y=0;//用以作为链的开头,不计入链中
while(num<m){ //num=m时,所有wood都遍历过了
for(real=1;wo[real].x==0;real++); // 跳过遍历过的wood
k=0;
for(i=real;i<=m+1;i++){
if((wo[k].y<=wo[i].y)&&wo[i].x!=0){
k=i; num++;
wo[i].x=0;//将遍历过的wood的x记为0,不再遍历
}
}
sum++;
}
printf("%d\n",sum);
}
return 0;
}