算法笔记_102:蓝桥杯练习 算法提高 快乐司机(Java)
目录
1 问题描述
喇叭响
我是汽车小司机
我是小司机
我为祖国运输忙
运输忙"
这是儿歌“快乐的小司机”。话说现在当司机光有红心不行,还要多拉快跑。多拉不是超载,是要让所载货物价值最大,特别是在当前油价日新月异的时候。司机所拉货物为散货,如大米、面粉、沙石、泥土......
现在知道了汽车核载重量为w,可供选择的物品的数量n。每个物品的重量为gi,价值为pi。求汽车可装载的最大价值。(n<10000,w<10000,0<gi<=100,0<=pi<=100)
第二行到第n+1行,每行有两个整数,由空格分开,分别表示gi和pi
99 87
68 36
79 43
75 94
7 35
解释:
先装第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)的更多相关文章
- 算法笔记_107:蓝桥杯练习 算法提高 学霸的迷宫(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要 ...
- 算法笔记_096:蓝桥杯练习 算法提高 求最大值(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负,bi之和非负 ...
- 算法笔记_067:蓝桥杯练习 算法训练 安慰奶牛(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是 ...
- 算法笔记_081:蓝桥杯练习 算法提高 矩阵乘法(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要将它们依次相乘,只能使用结合率,求最 ...
- 算法笔记_106:蓝桥杯练习 算法提高 周期字串(Java)
目录 1 问题描述 2 解决方案 2.1 第一印象解法(80分) 2.2 借鉴网友解法(100分) 1 问题描述 问题描述 右右喜欢听故事,但是右右的妈妈总是讲一些“从前有座山,山里有座庙,庙里有 ...
- 算法笔记_099:蓝桥杯练习 算法提高 排列数(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入一个数n 求0~9十个数的全排 ...
- 算法笔记_105:蓝桥杯练习 算法提高 上帝造题五分钟(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 第一分钟,上帝说:要有题.于是就有了L,Y,M,C 第二分钟,LYC说:要有向量.于是就有了长度为n写满随机整数的向量 第三分钟,YUHC ...
- 算法笔记_104:蓝桥杯练习 算法提高 新建Microsoft Word文档(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出的题目叫<新建Microsoft Word文档>吗? ...
- 算法笔记_103:蓝桥杯练习 算法提高 金明的预算方案(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些 ...
随机推荐
- 洛谷P1730最小密度路径
题目传送门; 首先理解题目,究其本质就是一个最短路问题,而且数据范围贼水,用floyd完全没问题,但是题目有变化,要求出路径边权值与边数之比,这里就可以考虑在把floyd中的二维数组变为三维,f[ i ...
- Git常用命令速查手册
Git组成 1.初始化仓库 git init 2.将文件添加到仓库 git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文 ...
- 洛谷——P1618 三连击(升级版)
P1618 三连击(升级版) 题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”. //感谢 ...
- grep 参数
功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- 密码统计分析工具pipal
密码统计分析工具pipal pipal是Kali Linux提供的一款密码统计分析工具.该工具可以对一个密码字典的所有密码进行统计分析.它会统计最常用的密码.最常用的基础词语.密码长度占比.构成字 ...
- request (请求对象)
一.学习请求 学习如何获取请求行, 请求头,请求体. 1. 获取请求行 获取请求方法 String method = request.getMethod(); System.out.println(m ...
- 【动态规划】POJ1661 Help Jimmy
Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11621 Accepted: 3827 Descr ...
- 【CCpp程序设计2017】推箱子游戏
我的还……支持撤销!用链表实现! 题目:推箱子小游戏(基于console) 功能要求: 将p09迷宫游戏改造为“推箱子”游戏: 在地图中增加箱子.箱子目标位置等图形: 当玩家将所有箱子归位,则显示玩家 ...
- 93.数字三角形W(深搜)
2189 数字三角形W 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 数字三角形 要求走到最后mod 10 ...
- insert into table(key)value('value') on duplicate key update key=value
MYSQL篇 新增如果unique索引字段重复,则更新: insert into mg_user(key,key2,key3)value('value','value2','value3') on d ...