乙级|1020.月饼

题目描述

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。

输入描述

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

输出描述

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

输入例子

3 20
18 15 10
75 72 45

输出例子

94.50

我的代码

#include
#define N 1000
typedef struct mylist{   //创建结构体
    float a; //库存
    float b; //总利润
   float c;  //利润率 
}LIST;
int main(){
    LIST p[N],t;
    int i,j,n,d;
    float w=0;
    scanf("%d %d",&n,&d);
    for(i=0;i=p[i].a){   //如果库存大于利润率最大的月饼的库存
            w=w+p[i].b;   //利润率最大的月饼全卖光
            d=d-p[i].a;   //库存=原库存-利润率最大的月饼的库存
        }
        else if(d

我的分析

这道题一开始确实是把我难倒了,我一开始的思路是类似于中学学的方程那样将总利润w用未知数来表示出来,然后依靠计算的使用穷举法进行计算,但是问题出在我并不知道系统将要给出几个类别的的月饼,所以不知道要循环几次,所以这种方法不行。然后转换为另一种思路,先计算每一种月饼的利润率(月饼的利润/月饼的库存量),然后按照利润率从大到小的顺序来排列,之后是如果库存小于市场需求量,则先将利润率高的月饼的库存全部卖光,然后计算剩余的库存,再接着卖第二种月饼,以此类推,直到满足市场需求量。
其实这道题在实现我上面的算法时没有花多少时间,但是在选择定义的数据类型以及输出的两位数上花掉了我一些时间。基础没有打好,有点不应该。

收获

这道题让我重新审视了不同数据类型之间的运算,发现如果定义时的类型不同,则两个变量进行计算后的结果也会差别很大。所以在这里总结一下:
1.如果两个数定义时都是int,则在输出时不论怎么怎么改变%或者是强制转换,它的值永远不会改变(有些只是在小数点后面加一些无关紧要的0)。
2.如果在某些题目中需要精确到小数点后面的小数,则一般定义时都是定义为double类型(double类型也可以接受输入类型为整型)但是他们在输出时必须使用%f或者是它的衍生,绝对不能是%d,否则输出时会是错误的。
3.如果记不住,则就记住这一句话,凡是涉及到精确运算的把运算符前后的数字类型都定义为int,而将它们计算之后的值定义为double,然后在计算是运用强制转换类型将运算数转换为double型,之后不论什么运算都不会出错

你可能感兴趣的:(乙级|1020.月饼)