zoukankan      html  css  js  c++  java
  • 算法笔记_102:蓝桥杯练习 算法提高 快乐司机(Java)

    目录

    1问题描述

    2 解决方案

     


    1 问题描述

    问题描述
      "嘟嘟嘟嘟嘟嘟
      喇叭响
      我是汽车小司机
      我是小司机
      我为祖国运输忙
      运输忙"
      这是儿歌“快乐的小司机”。话说现在当司机光有红心不行,还要多拉快跑。多拉不是超载,是要让所载货物价值最大,特别是在当前油价日新月异的时候。司机所拉货物为散货,如大米、面粉、沙石、泥土......
      现在知道了汽车核载重量为w,可供选择的物品的数量n。每个物品的重量为gi,价值为pi。求汽车可装载的最大价值。(n<10000,w<10000,0<gi<=100,0<=pi<=100)
    输入格式
      输入第一行为由空格分开的两个整数n w
      第二行到第n+1行,每行有两个整数,由空格分开,分别表示gi和pi
    输出格式
      最大价值(保留一位小数)
    样例输入
    5 36
    99 87
    68 36
    79 43
    75 94
    7 35
    样例输出
    71.3
    解释:
    先装第5号物品,得价值35,占用重量7
    再装第4号物品,得价值36.346,占用重量29
    最后保留一位小数,得71.3

     


    2 解决方案

    本题主要考查贪心法的运用,以及排序算法的运用,下面代码使用合并排序求解。

    具体代码如下:

    import java.util.Scanner;
    
    public class Main {
        
        static class good {
            public int weight;  //重量
            public double value;  //单价
            
            good(int weight, double value) {
                this.weight = weight;
                this.value = value;
            }
        }
        //使用合并排序,按照物品的单价value,对A进行从大到小排序
        public void mergeSort(good[] A) {
            if(A.length > 1) {
                good[] leftA = getHalfArray(A, 0);   //获取A的左半部分对象
                good[] rightA = getHalfArray(A, 1);  //获取A的右半部分对象
                mergeSort(leftA);
                mergeSort(rightA);
                getMerge(A, leftA, rightA);
            }
        }
        //根据judge判断,获取A的一半对象
        public good[] getHalfArray(good[] A, int judge) {
            good[] half;
            int len = A.length;
            if(judge == 0) {
                half = new good[len / 2];
                for(int i = 0;i < len / 2;i++)
                    half[i] = A[i];
            } else {
                half = new good[len - len / 2];
                for(int i = 0;i < len - len / 2;i++)
                    half[i] = A[len / 2 + i];
            }
            return half;
        }
        //对A进行合并,获取从大到小排序
        public void getMerge(good[] A, good[] leftA, good[] rightA) {
            int i = 0, j = 0, count = 0;
            int lenLeftA = leftA.length, lenRightA = rightA.length;
            while(i < lenLeftA && j < lenRightA) {
                if(leftA[i].value >= rightA[j].value)
                    A[count++] = leftA[i++];
                else
                    A[count++] = rightA[j++];
            }
            while(i < lenLeftA)
                A[count++] = leftA[i++];
            while(j < lenRightA)
                A[count++] = rightA[j++];
        }
        
        public void printResult(int w, good[] A) {
            mergeSort(A);
            int sumW = 0, i = 0;
            double result = 0;
            for(;i < A.length;i++) {
                if(sumW + A[i].weight <= w) {
                    sumW += A[i].weight;
                    result += A[i].weight * A[i].value;
                }
                else
                    break;
            }
            if(i < A.length)   //此处要特别注意,唯有还有物品剩余,才可以进行下面语句执行
                result += (w - sumW) * A[i].value;
            System.out.printf("%.1f", result);
            return;
        }
    
        public static void main(String[] args) {
            Main test = new Main();
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            int w = in.nextInt();
            if(n <= 0 || w == 0) {
                System.out.println("0.0");
                return;
            }
            good[] A = new good[n];
            for(int i = 0;i < n;i++) {
                int g = in.nextInt();
                int p = in.nextInt();
                double v = p * 1.0 / g;
                A[i] = new good(g, v);
            }
            test.printResult(w, A);
            
        }
    }
  • 相关阅读:
    websocket 初识
    JavaScript 系列博客(四)
    JavaScript 系列博客(三)
    JavaScript 系列博客(二)
    JavaScript 系列博客(一)
    前端(八)之形变
    前端(七)之动画与阴影
    java变量、数据类型
    js简单的获取与输出
    Eclipse字体修改
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6582614.html
Copyright © 2011-2022 走看看