zoukankan      html  css  js  c++  java
  • 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


    和之前的一道题有异曲同工之处:https://www.cnblogs.com/cstdio1/p/11368474.html
    有一个测试点没过。。。。。。
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.text.DecimalFormat;
    import java.util.*;    
    public class Main{    
    
        public Main(){}
        int i;//标号
        double price;//单价
        public static void main(String[] args) throws IOException {
            
    //        Scanner sc=new Scanner(System.in);用这个会超时
             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
             String []ab=bufferedReader.readLine().split(" ");
            int type=Integer.parseInt(ab[0]);
            int sumTone=Integer.parseInt(ab[1]);
            int []tone = new int[type];
            int []money=new int [type];
            Main []pric=new Main[type];//单价
             String []a=bufferedReader.readLine().split(" ");
            for(int i=0;i<type;i++){
            tone[i]=Integer.parseInt(a[i]);
            }
            String []b=bufferedReader.readLine().split(" ");
            for(int i=0;i<type;i++){
            money[i]=Integer.parseInt(b[i]);
            }
            for(int i=0;i<type;i++){
            pric[i] = new Main();
            pric[i].i=i;
            pric[i].price=money[i]*1.0/tone[i];
            }
            //排序
            for(int i=0;i<type-1;i++){
                for(int j=0;j<type-i-1;j++){
                    int t1=pric[j].i;
                    double t2=pric[j].price;
                    if(pric[j].price<pric[j+1].price){
                        pric[j].price=pric[j+1].price;
                        pric[j].i=pric[j+1].i;
                        pric[j+1].price=t2;
                        pric[j+1].i=t1;
                    }
                }
            }
            int sum=0,k=0;
            double res=0;
            while(sum<sumTone){
            if(sum+tone[pric[k].i]<=sumTone){
                res+=pric[k].price*tone[pric[k].i];        
            }else{
                res+=pric[k].price*(sumTone-sum);
            }
            
            sum+=tone[pric[k].i];
            if(k==type-1) break;//全部都卖出了还不够
            k++;
            
            }
            System.out.println(String.format("%.2f", res));
            
    //        for(int i=0;i<type;i++){
    //            System.out.println(pric[i].price);
    //        }
        
        }
    }
        

    之前犯的错误就是库存量和那个价格是正数不是正整数,然后测试点2的数据就是为小数的情况所以就gg了

    这道题的坑:

    ac代码:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.text.DecimalFormat;
    import java.util.*;    
    public class Main{    
    
        public Main(){}
        int i;//标号
        double price;//单价
        public static void main(String[] args) throws IOException {
            
    //        Scanner sc=new Scanner(System.in);用这个会超时
             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
             String []ab=bufferedReader.readLine().split(" ");
            int type=Integer.parseInt(ab[0]);
            int sumTone=Integer.parseInt(ab[1]);
            
            float []tone = new float[type];
            float []money=new float [type];
            Main []pric=new Main[type];//单价
             String []a=bufferedReader.readLine().split(" ");
            for(int i=0;i<type;i++){
            tone[i]=Float.parseFloat(a[i]);
            }
            String []b=bufferedReader.readLine().split(" ");
            for(int i=0;i<type;i++){
            money[i]=Float.parseFloat(b[i]);
            }
            for(int i=0;i<type;i++){
            pric[i] = new Main();
            pric[i].i=i;
            pric[i].price=money[i]*1.0/tone[i];
            }
            //排序
            for(int i=0;i<type-1;i++){
                for(int j=0;j<type-i-1;j++){
                    int t1=pric[j].i;
                    double t2=pric[j].price;
                    if(pric[j].price<pric[j+1].price){
                        pric[j].price=pric[j+1].price;
                        pric[j].i=pric[j+1].i;
                        pric[j+1].price=t2;
                        pric[j+1].i=t1;
                    }
                }
            }
            int sum=0,k=0;
            double res=0;
            while(sum<sumTone){
            if(sum+tone[pric[k].i]<=sumTone){
                res+=pric[k].price*tone[pric[k].i];        
            }else{
                res+=pric[k].price*(sumTone-sum);
            }
            
            sum+=tone[pric[k].i];
            if(k==type-1) break;//全部都卖出了还不够
            k++;
            
            }
            System.out.println(String.format("%.02f", res));
            
    //        for(int i=0;i<type;i++){
    //            System.out.println(pric[i].price);
    //        }
        
        }
    }
        

    不一样的烟火
  • 相关阅读:
    PA
    核电站问题(codevs 2618)
    [转]SQL SERVER 的排序规则
    C# 窗体控件输入框大写
    查看哪些端口被使用
    [转]Windows服务“允许服务与桌面交互”的使用和修改方法
    [转]OBJECT_ID 有哪些种类
    如何:对 Windows 窗体控件进行线程安全调用
    老人手机不要买山寨机
    VBA文本型数字变成数值
  • 原文地址:https://www.cnblogs.com/cstdio1/p/11784833.html
Copyright © 2011-2022 走看看