POJ 1065

题目大意:

给定一些木棍的数量,它们的长度以及重量,求出最少可以将这些木棍排成几列,每列的木棍的长度和重量呈非递减排列。

分析:

首先,将这些木棍 按它们的 长度从小到大排列,如果后面的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;
}


你可能感兴趣的:(编程,C++,算法,poj)