#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
萌新在这里谢过各位大神
这个应该是指针的问题,直接读指针是读指针的地址,而前面加一个* 号就是读指针的值。
后面的函数好像有点问题,应该是
int comp(const void x,const void *y)
{
return ((room )y).l-((room *)x).l;
}
#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;
}
#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编译没问题,你把出错界面我看看