读书人

杭电acm 1009 小弟我的代码错哪了

发布时间: 2012-08-09 15:59:21 作者: rapoo

杭电acm 1009 我的代码哪里错了?
这道题我就是按照J[i]/F[i]进行排序,然后从大到小选择,可为什么提交上去就错了呢?

还请高人指点!

代码如下:

其中快速排序的代码应该没有问题,只需看其它的地方。

#include<stdio.h>
struct Food
{
int J,F;
double power;
};
int Partition(struct Food *A,int L,int R)
{
int left=L,right=R;
int t1=A[left].J,t2=A[left].F;
double pivot=A[left].power;
while(right>left)
{
while(right>left && A[right].power<=pivot)
right--;
A[left].power=A[right].power;
A[left].J=A[right].J;
A[left].F=A[right].F;
while(right>left && A[left].power>=pivot)
left++;
A[right].power=A[left].power;
A[right].J=A[left].J;
A[right].F=A[right].F;
}
A[left].power=pivot;
A[left].J=t1;
A[left].F=t2;
return left;
}
int QuickSort(struct Food *A,int L,int R)
{
int pivot;
if(R>L)
{
pivot=Partition(A,L,R);
QuickSort(A,L,pivot-1);
QuickSort(A,pivot+1,R);
}
}
int main()
{
//M pounds of cat food,n rooms;
const int Max=1001;
int n,i,j;
double m,Get_max=0.0;
struct Food p[1001];
while((scanf("%lf%d",&m,&n))!=EOF)
{
if(m==-1 && n==-1)
break;
Get_max=0.0;
for(i=0;i<n;i++)
{
scanf("%d%d",&(p[i].J),&(p[i].F));
if(p[i].F)
p[i].power=1.0*p[i].J/p[i].F;
else if(p[i].F==0 && p[i].J!=0)
p[i].power=Max;
else
p[i].power=0.0;
}
QuickSort(p,0,n-1);
for(i=0;i<n;i++)
{
if(m>=p[i].F)
{
Get_max+=p[i].J;
m-=p[i].F;
}
else
{
Get_max+=m/p[i].F*p[i].J;
break;
}
}
printf("%.3lf\n",Get_max);
}
return 0;
}


[解决办法]

C/C++ code
#include<iostream>#include<algorithm>#include<iomanip>using namespace std;typedef struct{    double j;    double f;}node;bool cmp(node a,node b){    return (a.f * b.j < b.f * a.j);}int main(){    int m,n;    while(cin >> m >> n)    {        node a[1001];        if(-1 == m && -1 == n)            break;        int i;        for(i=0;i<n;i++)            cin >> a[i].j >> a[i].f;        sort(a,a+n,cmp);        double sum=0.0;        for(i=0;i<n;i++)        {            if(a[i].f < m)            {                sum += a[i].j;                m = m - a[i].f;            }            else            {                sum += (a[i].j * m)/a[i].f;                break;            }        }        cout<<fixed<<setprecision(3)<<sum<<endl;    }    return 0;}
------解决方案--------------------


我告诉楼主的错误在哪吧。你有考虑过
struct Food
{
int J,F;
double power;
};
这个结构体中F为0的情况么???
[解决办法]
拿你的代码做了下测试,用sort函数来排序,提交就正确,说明你自己的排序有问题,但还没有找到问题出在哪里。
提交的代码如下:通过了的

C/C++ code
#include<stdio.h>#include <algorithm>struct Food{    int J,F;    double power;};bool cmp(struct Food a,struct Food b){    return (a.F * b.J < b.F * a.J);}int Partition(struct Food *A,int L,int R){    int left=L,right=R;      int t1=A[left].J,t2=A[left].F;    double pivot=A[left].power;    while(right>left)       {        while(right>left && A[right].power<=pivot)               right--;        A[left].power=A[right].power;        A[left].J=A[right].J;        A[left].F=A[right].F;        while(right>left && A[left].power>=pivot)            left++;        A[right].power=A[left].power;        A[right].J=A[left].J;        A[right].F=A[right].F;    }    A[left].power=pivot;    A[left].J=t1;    A[left].F=t2;    return left;}int QuickSort(struct Food *A,int L,int R){    int pivot;    if(R>L)    {        pivot=Partition(A,L,R);           QuickSort(A,L,pivot-1);        QuickSort(A,pivot+1,R);    }    return 0;}int main(){    //M pounds of cat food,n rooms;    const int Max=1001;    int n,i,j;    double m,Get_max=0.0;    struct Food p[1001];    while((scanf("%lf%d",&m,&n))!=EOF)    {        if(m==-1 && n==-1)               break;        Get_max=0.0;        for(i=0;i<n;i++)        {            scanf("%d %d",&(p[i].J),&(p[i].F));            if(p[i].F)                p[i].power=1.0*p[i].J/p[i].F;            else if(p[i].F==0 && p[i].J!=0)                p[i].power=Max;            else                  p[i].power=0.0;        }        //QuickSort(p,0,n-1);        std::sort(p, p+n, cmp);        for(i=0;i<n;i++)          {            if(m>=p[i].F)              {                Get_max+=p[i].J;                m-=p[i].F;               }               else            {                Get_max+=m/p[i].F*p[i].J;                break;              }           }        printf("%.3lf\n",Get_max);    }    return 0;} 

读书人网 >C语言

热点推荐