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