2 lym77777 lym77777 于 2016.03.10 21:08 提问

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 21:11

萌新在这里谢过各位大神

visoncomputer
visoncomputer   2016.03.10 21:16

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

lym77777
lym77777 我下面给出的函数不知道是不是上传的时候弄错了
接近 2 年之前 回复
lym77777
lym77777 对于结构体来说不能这样比较么?但是我在使用的时候排序结果是一样的啊?
接近 2 年之前 回复
lym77777
lym77777   2016.03.10 21:26

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

lym77777
lym77777 求教大神们
接近 2 年之前 回复
lx624909677
lx624909677   Ds   Rxr 2016.03.10 22: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;
} 
lym77777
lym77777 抱歉,您可能没理解我的意思,我是想问那两种qsort函数的比较函数有什么不同,谢谢
接近 2 年之前 回复
John_ToStr
John_ToStr   Rxr 2016.03.11 11: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编译没问题,你把出错界面我看看

John_ToStr
John_ToStr 回复lym77777:看看你的返回值就有问题,
接近 2 年之前 回复
lym77777
lym77777 谢谢,运行没有问题,但是提交杭电就WA。
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!