题目大意:
给定一些木棍的数量,它们的长度以及重量,求出最少可以将这些木棍排成几列,每列的木棍的长度和重量呈非递减排列。
分析:
首先,将这些木棍 按它们的 长度从小到大排列,如果后面的len和weight都比cl,cw大的话,就将flag置为1,表示它已经排过了,并且更新cl,cw. 然后从头开始搜索,第一个flag为0,即没有安排的木棍,将它作为第二列的开始,直到将所有的木棍排完即可。
这里要注意的是 cmp函数
int cmp(const void *a, const void *b)
返回正数就是说 cmp 传入参数第一个要放在第二个后面, 负数就是传入参数第一个要放第二个前面, 如果是 0, 那就无所谓谁前谁后
#include<iostream>
using namespace std;
#define N 50000
typedef struct{
int len;
int weight;
int flag;
}stick;
stick sticks[N];
int cmp(const void *a,const void *b){
stick *p = (stick *)a;
stick *q = (stick *)b;
if(p->len>q->len)
return 1;
else if(p->len<q->len)
return -1;
else return p->weight > q->weight ? 1:-1;
}
int main(){
int nCase;
cin>>nCase;
int pointnum;
int count;
int cl,cw,i,j;
while(nCase--){
count = 1;
memset(sticks,0,sizeof(sticks));
cin>>pointnum;
for(int i=0;i<pointnum;i++)
cin>>sticks[i].len>>sticks[i].weight;
qsort(sticks,pointnum,sizeof(sticks[0]),cmp);
sticks[0].flag = 1;
cl = sticks[0].len;
cw = sticks[0].weight;
for(j=1;j<pointnum;j++){
for(i=j;i<pointnum;i++){
if(!sticks[i].flag&&sticks[i].len>=cl&&sticks[i].weight>=cw){
sticks[i].flag = 1;
cl = sticks[i].len;
cw = sticks[i].weight;
}
}
i = 1;
while(sticks[i].flag)
i++;
j = i;
if(j == pointnum)
break;
count ++;
cl = sticks[j].len;
cw = sticks[j].weight;
sticks[j].flag = 1;
}
cout<<count<<endl;
}
return 0;
}