PTA乙级----1020 月饼 (25 分)

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。

注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只有 20 万吨,那么我们最大收益策略应该是卖出全部 15 万吨第 2 种月饼、以及 5 万吨第 3 种月饼,获得 72 + 45/2 = 94.5(亿元)。

输入格式:

每个输入包含一个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N 表示月饼的种类数、以及不超过 500(以万吨为单位)的正整数 D 表示市场最大需求量。随后一行给出 N 个正数表示每种月饼的库存量(以万吨为单位);最后一行给出 N 个正数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。

输出格式:

对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后 2 位。

输入样例:

3 20
18 15 10
75 72 45

输出样例:

94.50

 本题用C语言做的话用到了指针,其他语言也可以做,讲下本题思路:

首先定义个结构体,其他语言这个叫啥不太清楚,不过看我的代码也会知道是啥了,就是一个自定义主变量,然后这个主变量又包括了其他几个变量,这几个变量就是主变量的几个属性,这就不多介绍了·;定义好一个产品的数量和价格以后,求出它的平均价格(就是数量除以价格)然后按照平均价格将这几个产品按照从大到小的顺序排下,排好以后,就开始卖东西了。按照题目中这个例子 要卖出的销量为20,吨,将上面3个产品排序后,其中数量为15吨的产品均价最高,就先卖这个产品,15<20,当然要卖完这个产品了,然后收益加上这个产品全部的价格就变成了72,还剩5吨没卖,接着选均价第二高的卖,就是第三个产品,5<10,产品数量足够,直接用均价乘于这个剩余销量再加上前面的那个收益就为本题答案最高收益了。

#include<stdio.h>
#include<stdlib.h> 
struct kind
{
    float number;/*产品数量*/
    float price;/*产品价格*/
    float avg;/*产品平均价格,产品平均价格=产品价格/产品数量*/
};
int cmp(const void *a,const void *b)/*C语言中qsort快速排序用到的比较函数,其他语言应该也有类似的快排函数,这题用了C语言的指针,使用其它语言的可以忽略*/
{
    struct kind *pa,*pb;
    pa=(struct kind*)a;
    pb=(struct kind*)b;
    if(pa->avg>pb->avg)
    {
    	return -1;
	}
	else
	{
		return 1;
	}
}
int main() 
{
    struct kind s[1001];
    int m,n,k=0;/*m是产品种类,n是要卖出的销量,sum为收益*/
    float sum=0;
    scanf("%d %d",&m,&n);
    for(int i=0;i<m;i++)
    {
        scanf("%f",&s[i].number);
    }
    for(int i=0;i<m;i++)
    {
        scanf("%f",&s[i].price);
        s[i].avg=s[i].price/s[i].number;
    }
    qsort(s,m,sizeof(struct kind),cmp);/*快速排序函数,想了解具体可以百度了解下,本函数是把每种产品的平均价格按照递减的顺序拍下,这样在销量一定时,先按照均价最高的产品卖,然后卖均价第二大的,依次卖,直至把该卖的产量卖完为止*/
    while(n!=0)
    {
        if(s[k].number<=n)/*如果产品数量小于要卖出的销量,则把这个产品全部卖出,收益sum也当然加上这个产品的所有价格*/
        {
            n-=s[k].number;
            sum+=s[k].price;
            k++;
            if(k==m)
            {
            	break;
			}
        }
        else/*如果要卖出的销量小于这个轮到的产品质量,则用它的平均价格乘于剩余要卖出的销量,再加给总收益就为本题答案最高收益了,n=0循环截止*/
        {
            sum+=s[k].avg*n;
            n=0;
        }
    }
    printf("%.2f",sum);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天行九歌。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值