首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

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

杭电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;} 

热点排行