目录

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

算法笔记_102:蓝桥杯练习 算法提高 快乐司机(Java)的更多相关文章

  1. 算法笔记_107:蓝桥杯练习 算法提高 学霸的迷宫(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要 ...

  2. 算法笔记_096:蓝桥杯练习 算法提高 求最大值(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负,bi之和非负 ...

  3. 算法笔记_067:蓝桥杯练习 算法训练 安慰奶牛(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是 ...

  4. 算法笔记_081:蓝桥杯练习 算法提高 矩阵乘法(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要将它们依次相乘,只能使用结合率,求最 ...

  5. 算法笔记_106:蓝桥杯练习 算法提高 周期字串(Java)

    目录 1 问题描述 2 解决方案 2.1 第一印象解法(80分) 2.2 借鉴网友解法(100分)   1 问题描述 问题描述 右右喜欢听故事,但是右右的妈妈总是讲一些“从前有座山,山里有座庙,庙里有 ...

  6. 算法笔记_099:蓝桥杯练习 算法提高 排列数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入一个数n 求0~9十个数的全排 ...

  7. 算法笔记_105:蓝桥杯练习 算法提高 上帝造题五分钟(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 第一分钟,上帝说:要有题.于是就有了L,Y,M,C 第二分钟,LYC说:要有向量.于是就有了长度为n写满随机整数的向量 第三分钟,YUHC ...

  8. 算法笔记_104:蓝桥杯练习 算法提高 新建Microsoft Word文档(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出的题目叫<新建Microsoft Word文档>吗? ...

  9. 算法笔记_103:蓝桥杯练习 算法提高 金明的预算方案(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些 ...

随机推荐

  1. Xamarin开发安装Visual Studio 2015 update2报错的解决办法

    Xamarin开发安装Visual Studio 2015 update2报错的解决办法错误信息:update 2 requires a member of the visual studio 201 ...

  2. 常见OJ提交结果对照表

    Waiting:你的程序刚刚提交,正在等待OJ评测你的程序.   Compiling:OJ正在编译你的程序.   Accepted:OK!你的程序是正确的 ^_^.   Wrong Answer:你的 ...

  3. 一个应用 可以有多个application

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 一个应用里面怎样才能有2个application 一个AndroidManifest.xml中可 ...

  4. [BZOJ2159]Crash的文明世界(斯特林数+树形DP)

    题意:给定一棵树,求$S(i)=\sum_{j=1}^{n}dist(i,j)^k$.题解:根据斯特林数反演得到:$n^m=\sum_{i=0}^{n}C(n,i)\times i!\times S( ...

  5. [BZOJ3000]Big Number(斯特林公式)

    求n!在k进制下的位数,n<=1e18 斯特林公式:$n!\approx \sqrt{2\pi n}(\frac{n}{e})^n$ 在n很大的时候有较好的精度保证. $\log_{k}n!+1 ...

  6. JZYZOJ1544 [haoi2016T2]放棋子 错排公式 组合数学 高精度

    http://172.20.6.3/Problem_Show.asp?ID=1544&a=ProbNF 看了题解才意识到原题有错排的性质(开始根本不知道错排是什么). 十本不同的书放在书架上. ...

  7. 【20181019T1】加密【逆元+位运算】

    题面 [错解] 可能要逆推 <<就是乘法,好做 但^是什么东西? 欸暴力map70分,索性妥协 [正解] 注意^是自己异或上自己右移,前i位就是t的前i位 往后推就好 代码

  8. ZXing for Android 修改为竖屏模式

    zxing github连接:https://github.com/zxing/zxing 以下为修改方法 Step 1: Add following lines to rotate data bef ...

  9. UI Watcher 解决不定时弹窗问题

    缘来是你: 在基于UI谷歌库的测试系统对第三方APK测试例,存在不定时弹窗问题,对测试例的健壮性和稳定性产生了很大影响. 为了解决这个问题,谷歌开源了UIwatcher 类来解决此问题. 附谷歌官网类 ...

  10. 微软笔试Highway问题解析

      High way   时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 In the city, there is a one-way straight highway ...