您的位置:首页 > 其它

POJ 1065 贪心

2017-03-22 00:00 211 查看

解题步骤

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

用结构体来存储木棍的长度和重量,用链表来存储N个木棍

对链表进行升序排序,长度作为第一关键字,重量作为第二关键字,即长度递增,若长度相等,则重量递增。

对排序后的链表处理,遍历链表的所有节点(木棍)。对于当前节点,找到所有满足条件的节点( 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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表 poj c 贪心算法