PAT 1020 月饼

这篇博客讨论了三种不同的代码实现,用于计算在给定市场需求和月饼库存情况下所能获得的最大利润。第一种代码使用了浮点数表示库存和总价,第二种通过循环找出最大单价并计算利润,第三种则采用了排序算法。博主发现了在处理浮点数时可能出现的精度问题,并分享了解决方案。文章强调了代码优化和正确处理数值类型的重要性。
摘要由CSDN通过智能技术生成

自己写的代码(23分,不知道哪里除了问题 )

问题在于题目上说的库存和总价都是正数,没有说是正整数,所以表示库存和总价的时候还是得用浮点数表示(正整数包括正整数和正小数!

#include <stdio.h>

struct Moon
{
    int k;    //k表示库存
    int s;    //s表示总售价
    float d;    //表示这种月饼的单价 
}moon;

int main(void)
{
    float N;    //N为种类数,D为市场需求
    int D;
    scanf("%f %d",&N,&D); 
    struct Moon moon[N];
    int i,j;
    struct Moon temp;
    float p=0;
    
    for(i=0;i<N;i++)    //输入库存总售价,并计算出单价 
    {
        scanf("%d",&moon[i].k ); 
    } 
    for(i=0;i<N;i++)
    {
        scanf("%d",&moon[i].s);
    }
    for(i=0;i<N;i++)
    {
        moon[i].d=(float)moon[i].s/moon[i].k;
    }

    //将结构体按单价的高低依次排序
    for(i=0;i<N;i++)
    {
        for(j=0;j<N-i;j++)
        {
            if(moon[j].d<moon[j+1].d)
            {
                temp=moon[j+1];
                moon[j+1]=moon[j];
                moon[j]=temp;
            }    
        }    
    }

    //计算总利润
    for(i=0;i<N;i++)
    {
        if(D>=moon[i].k)
        {
            D-=moon[i].k;
            p+=moon[i].s;
        }
        else
        {
            p+=(float)D/moon[i].k*moon[i].s;
            D=0;
        }
        if(D==0)
        {
            break;
        }
    } 
    
    printf("%.2f\n",p);
    

    return 0;
}

别人写的代码(利用循环找出最大单价,然后算利润)

#include <stdio.h>
int main(){
    int n;  //表示种类 
    float d, profit = 0, price[1000], stock[1000];
    int i, max;
    scanf("%d %f", &n, &d);//d表示市场需求 
    for(i = 0; i < n; i++) scanf("%f", stock+i);//库存 
    for(i = 0; i < n; i++) scanf("%f", price+i);//总售价 
    while(d > 0){
        max = 0;
        for(i = 0; i < n; i++){      //此循环求出最大单价 
            if(price[i] / stock[i] > price[max] / stock[max]){
                max = i;
            }
        }
        if(d > stock[max]){
            profit += price[max];
            d -= stock[max];
            price[max] = 0; //※将库存更新为零 !!!
        }
        else{
            profit += d * price[max] / stock[max];
            d = 0;
        }
    }
    printf("%.2f\n", profit);
    return 0;
}


 

2022.6.26

注意:不知道为什么在gcc编译器qsort函数返回值时-号有点不行,以后就都用>好吧

#include <stdio.h>
#include <stdlib.h>

typedef struct Moon{
	int ku;
	float sale;
	float price;
}moon;

int compare(const void *a,const void *b){
	moon A=*(moon *)a;
	moon B=*(moon *)b;
	
	return B.price>A.price;
}

int main(void){
	int n,d,i;
	scanf("%d %d",&n,&d);
	moon moon[n];
	float sum=0;

	for(i=0;i<n;i++){
		scanf("%d",&moon[i].ku);
	}
	for(i=0;i<n;i++){
		scanf("%f",&moon[i].sale);
		moon[i].price=moon[i].sale/moon[i].ku;
	}

	qsort(moon,n,sizeof(moon[0]),compare);
    
	for(i=0;i<n;i++){
		if(d>moon[i].ku){
			sum+=moon[i].sale;			
			d-=moon[i].ku;
		}
		else{
			sum+=d*moon[i].price;
			break;
		} 
	}

	printf("%.2f\n",sum);
	return 0;
}

发现了一个问题:最后一个else那里,如果我不直接乘单价,而是用d/总的库存在乘总售价,这样有个测试点会过不去,可能是因为d是整数,然后出了另一个整数会出现误差,然后导致最后结果出错的情况! 

好好学习,天天向上!

我要考研!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值