POJ 1065 贪心

5 篇文章 0 订阅

解题步骤

采用贪心的思想,在剩余木棍当中选择长度最短重量最小的木棍作为该批次的起始,然后将剩余木棍中所有满足条件(l <= l’ and w <= w’)的木棍加入该批次,然后重新选择木棍开始新的批次。

  1. 用结构体来存储木棍的长度和重量,用链表来存储N个木棍
  2. 对链表进行升序排序,长度作为第一关键字,重量作为第二关键字,即长度递增,若长度相等,则重量递增。
  3. 对排序后的链表处理,遍历链表的所有节点(木棍)。对于当前节点,找到所有满足条件的节点( l <= l’ and w <= w’)并删除之,直至到达链表末尾,启动时间加一。

代码

#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Sticks)

struct Sticks{
    int len;
    int wei;
    struct Sticks *next;
};

void StructSort(struct Sticks *head);

int main()
{
    int t,n;
    struct Sticks *head,*ptr,*tmp;
    int i,l,w,nl,nw,num;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        head = (struct Sticks*)malloc(LEN);
        ptr = (struct Sticks*)malloc(LEN);
        scanf("%d%d",&ptr->len,&ptr->wei);
        ptr->next = NULL;
        head->next = ptr;
        for(i=1;i<n;i++){
            tmp = (struct Sticks*)malloc(LEN);
            scanf("%d%d",&tmp->len,&tmp->wei);
            tmp->next = NULL;
            ptr->next = tmp;
            ptr = ptr->next;
        }
        StructSort(head);
        tmp = head->next;
        num = 0;
        while(tmp!=NULL){
            l = tmp->len;
            w = tmp->wei;
            for(ptr=tmp;ptr!=NULL;){
                //满足条件,删除该节点(木棍)
                if(ptr->next!=NULL&&ptr->next->len>=l&&ptr->next->wei>=w){
                    l = ptr->next->len;
                    w = ptr->next->wei;
                    ptr->next  = ptr->next->next;
                }else if(ptr!=NULL){ //继续寻找满足条件的节点(木棍)
                    ptr = ptr->next;
                }
                if(ptr==NULL)
                    break;
            }
            num++;
            tmp = tmp->next;
        }
        printf("%d\n",num);
    }
    return 0;
}
//选择 升序
void StructSort(struct Sticks *head){
    struct Sticks *p,*sm,*q;
    int l,w;
    for(p = head->next;p!=NULL;p = p->next){
        sm = p;
        l = p->len;
        w = p->wei;
        for(q = p->next;q!=NULL;q = q->next){
            if(q->len<sm->len)
                sm = q;
            else if(q->len==sm->len&&q->wei<sm->wei)
                sm = q;
        }
        if(sm!=p){
            p->len = sm->len;
            p->wei = sm->wei;
            sm->len = l;
            sm->wei = w;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值