zoukankan      html  css  js  c++  java
  • 牛客网 PAT 算法历年真题 1010 : 月饼 (25)

    月饼 (25)

    时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)

    题目描述

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

    注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有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
     
     
    思路分析:
     
    1.首先用每种月饼的总售价除以月饼的库存量,得到每种月饼的平均单价,
     
    2.根据月饼的单价的降序将月饼进行排序,
     
    3.判断单价最高的月饼的库存量是否能够满足市场最大需求量,
     
      ①若满足,则直接用需求量*单价就得出最大收益了,
     
     
        例如输入:
          2   100
          200  300
          400  300
     
        表示共有两种月饼,市场最大需求量为100,
     
        第一种月饼的单价:400/200=2,第二种月饼的单价:300/300=1,
     
        所以首先选择单价为2的月饼,因(市场需求量)100<200(单价最大的月饼的库存量),
     
        则100*2=200就是最大收益。
     
     
      ②否则用需求量减去单价最高的月饼的库存量,得到一个新的需求量,
     
      再判断单价第二大的月饼的库存是否满足需求量,,,
     
      以此递归下去,直至满足市场的需求量为止。
     
        例如输入:
          2   300
          200  300
          400  300
     
        表示共有两种月饼,市场最大需求量为300,
     
        第一种月饼的单价:400/200=2,第二种月饼的单价:300/300=1,
     
        所以首先选择单价为2的月饼,因(市场需求量)300>200(单价最大的月饼的库存量),这种月饼要全部卖出;
     
        需求量=300-200=100;
     
        重复以上步骤,因为100<300,所以收益=100*1=100;
     
        则200*2+100*1=500就是总的最大收益。
     
     
    Java 代码如下:
     
    import java.util.Scanner;
    public class Main {
        public static void main(String[] args) {
            Scanner sca = new Scanner(System.in);
            int n = sca.nextInt();
            int d = sca.nextInt();
            double[] Stock = new double[n];
            double[] price = new double[n];
            double[] Proportion = new double[n];
            double temp;
            double sum = 0;
            for (int i = 0; i < price.length; i++) {
                Stock[i] = sca.nextFloat();
            }
            for (int i = 0; i < price.length; i++) {
                price[i] = sca.nextFloat();
            }
            for (int i = 0; i < Proportion.length; i++) {
                Proportion[i] =price[i]/(Stock[i]*1.000); 
            }
            for (int i = 0; i < Proportion.length-1; i++) {
                for (int j = i+1; j < Proportion.length; j++) {
                    if(Proportion[i]<Proportion[j]){
                        temp = Proportion[j];
                        Proportion[j] = Proportion[i];
                        Proportion[i] = temp;
                        
                        temp = Stock[j];
                        Stock[j] = Stock[i];
                        Stock[i] = temp;
                        
                        temp = price[j];
                        price[j] = price[i];
                        price[i] = temp;
                    }
                }
            }
            
            for (int i = 0; i < Proportion.length; i++) {
                if(d==0)
                    break;
                if(d>=Stock[i]){
                    sum+=price[i];
                    d-=Stock[i];
                }else{
                    sum+=Proportion[i]*1.000*d;
                    d=0;
                }
            }
            System.out.println(String.format("%.2f",sum));
        }
    }
    作者:十八岁

    -------------------------------------------

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    c++引用(reference)
    c++ 三目运算符功能增强
    C++ “新增”bool类型关键字
    C++ struct
    C++命名空间(namespace)
    基于python 实现KNN 算法
    Chrome 快捷键使用
    WOE(weight of evidence, 证据权重)
    python 命令运行环境下 ModuleNotFoundError: No module named 'Test'
    基于python 信用卡评分系统 的数据分析
  • 原文地址:https://www.cnblogs.com/l199616j/p/10313790.html
Copyright © 2011-2022 走看看