有个测试点一直通不过,搜索了一下原来是这个原因
在之前的代码中,为了程序的大小和效率,把每种月饼的总价和库存量等数据定义为int,但单价为double,在中间过程的计算中,涉及了一些两种数据类型的转化,从而在某些测试点产生错误,在将所有相关计算量统一为double之后,错误消除,推测为类型不同产生的double类型计算误差。
正确的代码
#include<stdio.h>
#include<stdlib.h>
struct yuebing
{
double total;
double totalprice;
double price;
};
int comp(const void * a,const void * b)
{
struct yuebing * L = (struct yuebing *)a;
struct yuebing * R = (struct yuebing *)b;
return L->price < R ->price;
}
int main()
{
int N,D,i;
scanf("%d %d",&N,&D);
struct yuebing sum[N];
for(i=0;i<N;i++)
scanf("%lf",&sum[i].total);
for(i=0;i<N;i++)
{
scanf("%lf",&sum[i].totalprice);
sum[i].price = sum[i].totalprice/sum[i].total;
}
qsort(sum,N,sizeof(struct yuebing),comp);
//for(i=0;i<N;i++)
// printf("%d %d %lf\n",sum[i].total,sum[i].totalprice,sum[i].price);
double toPrice =0;
for(i=0;i<N;++i)
{
if(D == 0)
break;
if(D>=sum[i].total)
{
D = D-sum[i].total;
toPrice += sum[i].totalprice;
}
else
{
toPrice += sum[i].totalprice /(sum[i].total/D);
D = 0;
}
}
printf("%0.2lf",toPrice);
return 0;
}