poj 1065 简单的贪心算法

题意大概是:有一组木头需要处理,每块木头有长度,重量两个属性,处理的前一块木头长len,重wei,当下一块木头的len1,与wei1满足:len1>len&&wei1>wei 时不需要准备时间,否则需要1分钟的准备时间,问最短的准备时间。

一开始的思路是将所有木头按照长度,重量两个属性从小到大排序后,找逆序数+1。

后来发现这样的思路是有问题的,比如排序后木头的重量是:1,2,3,4,5,6,4,7,8,9,10,9

如果按寻找逆序数的方法则需要分成

1,2,3,4,5,6

4,7,8,9,10

9

三组。需要3分钟准备。

争确的分组方法应该是:

1,2,3,4,5,6,7,8,9,10

4,9

两组,需要2分钟准备。

另外说一下qsort的comp函数写法,  

int comp(const void * a,const void * b){

    if((*(wooden *)a).len>(*(wooden*)b).len){

        return 1;

    }

    else if((*(wooden *)a).len==(*(wooden*)b).len&&(*(wooden*)a).wei>(*(wooden*)b).wei){

        return 1;

    }

    else if((*(wooden *)a).len==(*(wooden*)b).len&&(*(wooden*)a).wei==(*(wooden*)b).wei){

        return 0;

    }

    else{

        return -1;

    }

    /*if((*(wooden *)a).len==(*(wooden *)b).len){

        return ((*(wooden *)a).wei-(* (wooden *)b).wei);

    }

    else{

        return ((*(wooden *)a).len-(*(wooden *)b).len);

    }*/

}

参数必须是const void * 类型。

如果满足>关系则返回1 =关系返回0 <返回-1 

因此可以自己定制大于小于条件。

我因为没有考虑到所有的大于小于关系wa了无数次,最后才发现竟然是因为排序问题。

其实注释中的写法更简洁,但是我还是喜欢非注释中的写法。
 

下面是ac代码:

#include<stdio.h>

#include<string.h>

#include<algorithm>

#include<stdlib.h>

typedef struct node {

    int len;

    int wei;

    int vi;

}wooden;



int comp(const void * a,const void * b){

    if((*(wooden *)a).len>(*(wooden*)b).len){

        return 1;

    }

    else if((*(wooden *)a).len==(*(wooden*)b).len&&(*(wooden*)a).wei>(*(wooden*)b).wei){

        return 1;

    }

    else if((*(wooden *)a).len==(*(wooden*)b).len&&(*(wooden*)a).wei==(*(wooden*)b).wei){

        return 0;

    }

    else{

        return -1;

    }

    /*if((*(wooden *)a).len==(*(wooden *)b).len){

        return ((*(wooden *)a).wei-(* (wooden *)b).wei);

    }

    else{

        return ((*(wooden *)a).len-(*(wooden *)b).len);

    }*/

}

int main(){

    int T,n,i,j,num,first;

    wooden woo[5010];

    scanf("%d",&T);

    while(T--){

        scanf("%d",&n);

        if(n==0){

            printf("0\n");

            continue;

        }

        for(i=0;i<n;i++){

            scanf("%d %d",&woo[i].len,&woo[i].wei);

            woo[i].vi=0;

        }

        qsort(woo,n,sizeof(woo[0]),comp);

        num=0;

        for(i=0;i<n;i++){

            if(woo[i].vi==0){

                num++;

                woo[i].vi=1;

                first=woo[i].wei;

                for(j=i+1;j<n;j++){

                    if(woo[j].wei>=first&&woo[j].vi==0){

                        woo[j].vi=1;

                        first=woo[j].wei;

                    }

                }

            }

        }

        printf("%d\n",num);

    }

    return 0;

}

 

 

 

你可能感兴趣的:(贪心算法)