我写的代码以m为递减的变量,m每减一,sum就增加当前一枚金币所能换取的最大javabean数量,但这样造成了很多的的误差,最后累计下来就很显著了,下面附上一位大牛的ac代码,他的做法使误差大大减少。
我还学到了stdlib.h的用法,在编译器的同名文件中用记事本可以查看其内容。受益匪浅。。。
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1001
struct JavaBean
{
int j,f;
double g;
};
int comp(const void *a, const void *b)
{
return (*(struct JavaBean *)a).g > (*(struct JavaBean *)b).g ? -1:1;
}
int main()
{
int n,m,i;
double sum;
struct JavaBean jb[MAXN];
while (scanf("%d%d",&m,&n)&&(m!=-1||n!=-1))
{
sum=0.0;
for (i=0;i<n;i++)
scanf("%d%d",&jb[i].j,&jb[i].f),jb[i].g=(double)jb[i].j/jb[i].f;
qsort(jb,n,sizeof(jb[0]),comp);
//for (i=0;i<n;i++) printf("jb[%d] j=%d f=%d g=%.3fn",i,jb[i].j,jb[i].f,jb[i].g);
for (i=0;i<n;i++)
if (m-jb[i].f>=0) m-=jb[i].f,sum+=jb[i].j;
else
{
sum+=jb[i].g*m;
break;
}
printf("%.3f\n",sum);
}
return 0;
}