目录

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. HDU 1829 A Bug's Life 【带权并查集/补集法/向量法】

    Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes ...

  2. ZSTU OJ 4273 玩具

    枚举,二分,$RMQ$. 肯定是将连续一段中最大值免去花费,枚举起点之后,二分终点即可.可以证明单调性. #include<map> #include<set> #includ ...

  3. vue中的锚链接跳转问题

    在vue中的锚链接和普通的html不同,关于vue中的锚链接可以参考vue 中的  scrollBehavior 滚动行为. 在router.js中 //创建 router 实例 const rout ...

  4. 设计模式-命令模式(Command Pattern)

    本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 命令模式简述 命令模式的主要作用是将“行为请求者”和“行为实现者”解耦.举个例子,假如我们现在要 ...

  5. Kali Linux WPScan更新到2.9.3

    Kali Linux WPScan更新到2.9.3   WPScan是Kali Linux内置的一款Web漏洞扫描工具,专门扫描WordPress模版构建的网站.该工具最近更新到2.9.3.在新版本中 ...

  6. mtk预装apk 方案公司内置预装apk

    mtk预装apk 方案公司内置预装apk 韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha == MTK 预知第三方的APK 流程_yua ...

  7. [BZOJ4033][HAOI2015]树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2437  Solved: 1034[Submit][Stat ...

  8. 【BFS】POJ3669-Meteor Shower

    [思路] 预处理时先将陨石落到各点的最短时间纪录到数组中,然后在时间允许的范围内进行广搜.一旦到某点永远不会砸到,退出广搜. #include<iostream> #include< ...

  9. bzoj 4401: 块的计数

    4401: 块的计数 Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构——块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对 ...

  10. Android系统UI交互控件Action Bar初探

    过年期间,Google正式宣布取消Android系统中MENU键的使用,也就是基于Android 4.0系统的手机都应没有MENU这一固定按键.这无疑是个变革性的改动,在我眼中,这似乎把Android ...