POJ 1065

116 篇文章 2 订阅
8 篇文章 1 订阅

题目大意:

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

分析:

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值