• 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);
    //        }
        
        }
    }
        

    不一样的烟火
  • 相关阅读:
    Kubernetes 再深入一点点
    10分钟完成 mongodb replSet 部署
    网络篇
    p2p 打洞专场(转)
    Dockerfile 编写
    关于github 代码管理,协作开发
    Kubernetes 基于 ubuntu18.04 手工部署 (k8s)
    备忘 ubuntu ip 及 dns 的坑
    各种语言web性能简单对比测试
    vue 按需加载
  • 原文地址:https://www.cnblogs.com/cstdio1/p/11784833.html
Copyright © 2020-2023  润新知