lym77777
lym77777
采纳率0%
2016-03-10 13:08 浏览 1.7k

c++中qsort函数自定义比较函数的问题(杭电1009)

            #include<iostream>
            #include<iomanip>
            #include<stdlib.h>
            #include<stdio.h>
            #include<algorithm>
            using namespace std;

            struct room
            {
                double amount,l;
                int number;
            };
            int comp(const void *x,const void *y);
            int main()
            {
                int n,m,k;
                double sum;
                while(cin>>n>>m)
                {
                    sum=0;
                    if(n==-1&&m==-1)
                        break;
                    room *a=new room [m];       
                    for(k=0;k<m;k++)
                    {
                        cin>>a[k].amount>>a[k].number;
                        a[k].l=a[k].amount/a[k].number;
                    }
                    qsort(a,m,sizeof(a[0]),comp);

                    for(k=0;k<m;k++)
                    {
                        if(n>a[k].number)
                        {
                            sum+=a[k].amount;
                            n-=a[k].number;
                        }
                        else
                        {
                            sum+=double(n)/a[k].number*a[k].amount;
                            break;      
                        }
                    }
            //      for(k=0;k<m;k++)
            //          cout<<a[k].amount<<" "<<a[k].number<<" "<<a[k].l<<endl;
                    cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum<<endl;
                    delete [] a;
                }
                return 0;
            }
            int comp(const void *x,const void *y)
            {
                return (*(room *)y).l>(*(room *)x).l?1:-1;
            }

以上代码中qsort的比较函数如果写成上述代码形式可以过杭电1009
而如果写成
int comp(const void x,const void *y)
{
return (
(room )y).l-((room *)x).l;
}
则过不了,请问大神们这两种写法有什么区别啊?

int comp(const void *x,const void *y)
{
    return (*(room *)y).l>(*(room *)x).l?1:-1;
}

int comp(const void *x,const void *y)
{
    return (*(room *)y).l-(*(room *)x).l;
}

题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1009

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

5条回答 默认 最新

  • lym77777 lym77777 2016-03-10 13:11

    萌新在这里谢过各位大神

    点赞 评论 复制链接分享
  • visoncomputer visoncomputer 2016-03-10 13:16

    这个应该是指针的问题,直接读指针是读指针的地址,而前面加一个* 号就是读指针的值。

    点赞 评论 复制链接分享
  • lym77777 lym77777 2016-03-10 13:26

    后面的函数好像有点问题,应该是
    int comp(const void x,const void *y)
    {
    return (
    (room )y).l-((room *)x).l;
    }

    点赞 评论 复制链接分享
  • lx624909677 lx624909677 2016-03-10 14:43
     #include<stdio.h>
    #include<stdlib.h>
    #define maxsize 10000
    
    struct trade{
        int J;
        int F;
        double value;
    } tradeObj[maxsize];
    
    int cmp(const void *a,const void *b){
        struct trade *aa=(trade *)a;
        struct trade *bb=(trade *)b;
        return ((aa->value<bb->value)?1:-1);
    }
    int main(){
        int M,N,i;
        double totalMount;
        while(scanf("%d %d",&M,&N)!=EOF){
            totalMount=0.000;
            if(M==-1&&N==-1)
                break;
            for(i=0;i<N;i++){
                scanf("%d %d",&tradeObj[i].J,&tradeObj[i].F);
                tradeObj[i].value=((double)tradeObj[i].J)/((double)tradeObj[i].F);
            }
            if(N==0){
                printf("%.3f\n",totalMount);
                continue;
            }
            if(M==0){
                for(i=0;i<N;i++){
                    if(tradeObj[i].F==0){
                        totalMount+=(double)tradeObj[i].J;
                    }
                }   
                printf("%.3f\n",totalMount);
                continue;
            }   
            qsort(tradeObj,N,sizeof(tradeObj[0]),cmp);
            //for(i=0;i<N;i++)
            //  printf("%d %d %f\n",tradeObj[i].J,tradeObj[i].F,tradeObj[i].value);
            i=0;
            while(M){
                if(M>=tradeObj[i].F){
                    totalMount+=(double)tradeObj[i].J;
                    //totalMount+=tradeObj[i].J;
                    M-=tradeObj[i].F;
                }
                else{
                    totalMount+=((double)M)/((double)tradeObj[i].F)*((double)tradeObj[i].J);
                    //totalMount+=M/tradeObj[i].F*tradeObj[i].J;
                    break;
                }           
                i++;    
            }
            printf("%.3f\n",totalMount);
        }
        return 0;
    } 
    
    点赞 评论 复制链接分享
  • John_ToStr John_ToDebug 2016-03-11 03:30

    #include

    struct room
    {
    double amount, l;
    int number;
    };

    double comp(const void x, const void *y)
    {
    return (
    (room )y).l - ((room *)x).l;
    }

    int comp1(const void x, const void *y)
    {
    return (
    (room )y).l > ((room *)x).l ? 1 : -1;
    }

    int main()
    {
    double a = comp1("asd", "fgh");
    printf("%f\n", a);
    return 0;
    }

    没有不同,我用VS2013编译没问题,你把出错界面我看看

    点赞 评论 复制链接分享

相关推荐