【三星笔试】给定一些汽油E,给定一段距离D,完成D这段距离...
文章目录
- 题干
- 思路
- 动态规划解法
题干
测试样例
5
130 30
4 50 7
5 0 5
5 10 4
5 20 3
5 30 2
91 30
4 50 7
5 0 5
5 10 4
5 20 3
5 30 2
100 20
3 30 11
3 50 5
4 10 3
4 30 2
4 50 1
10 5
6 19 6
6 29 5
6 39 4
6 49 3
6 59 2
600 40
3 11 20
3 18 16
3 36 14
3 41 13
3 53 12
思路
直接想法肯定是DFS或BFS,对5种交通工具都做一个探测,递归深度为需要走过的距离D,也就是一棵深度为D的5叉树,时间复杂度O(5n)O(5^n)O(5n),不会爆栈,但肯定会超时的,剪枝的话貌似也没有比较好的策略。所以这道题还是要找其他方法的。
动态规划解法
设定一个D×(E+1)D\times (E+1)D×(E+1)的dp数组,dp[i][j]dp[i][j]dp[i][j]表示当有jjj容量汽油时,走iii公里需要的最小时间,有解法如下:
public class Gas {static int inf = 0x7fffffff;public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();for (int i = 0; i < n; i++) {int E = sc.nextInt(), D = sc.nextInt();int[][] cars = new int[5][2];for (int j = 0; j < 5; j++) {// 这里的时间都用秒来表示cars[j][0] = sc.nextInt() * 60 + sc.nextInt();cars[j][1] = sc.nextInt();}int ans = func(E, D, cars);System.out.println(ans == inf ? -1 : ans);}}private static int func(int E, int D, int[][] cars) {int[][] dp = new int[D][E+1];for (int i = 0; i < D; i++) {Arrays.fill(dp[i], inf);if(i == 0) {for (int j = 0; j < 5; j++) dp[i][cars[j][1]] = cars[j][0];int idx = 0;while (idx <= E && dp[i][idx] == inf) idx++;for (; idx <= E; idx++) {if (dp[i][idx] == inf) dp[i][idx] = dp[i][idx-1];}} else {for (int j = 0; j <= E; j++) {for (int k = 0; k < 5; k++) {int preLineIdx = j-cars[k][1];if(preLineIdx < 0 || dp[i-1][preLineIdx] == inf) continue;dp[i][j] = Math.min(dp[i][j], dp[i-1][j-cars[k][1]]+cars[k][0]);}}}}return dp[D-1][E-1];}
}
adv汽车油
数据结构—交通工具
【三星笔试】给定一些汽油E,给定一段距离D,完成D这段距离...相关推荐
- 【组合数学】生成函数 ( 生成函数示例 | 给定通项公式求生成函数 | 给定生成函数求通项公式 )
文章目录 一.给定级数求生成函数 二.给定生成函数求级数 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...
- 三星笔试能带计算机吗,2021年三星笔试试题+经验谈
<2021年三星笔试试题+经验谈>由会员分享,可在线阅读,更多相关<2021年三星笔试试题+经验谈(4页珍藏版)>请在人人文库网上搜索. 1.三星笔试试题+经验谈 时间大约3个 ...
- Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
问题内容是:给定一个数组,给定一个数字.返回数组中可以相加得到指定数字的两个索引. 比如:给定nums = [2, 7, 11, 15], target = 9 那么要返回 [0, 1],因为2 + ...
- SON_EXAM考试php,通用全国少儿英语等级考试:三星笔试真题
单项选择: 36. exciting the game was! I enjoyed every minute of it. A.What B. How C.What an B.How an 37.Y ...
- 两数之和:找出给定数组中和是给定目标整数的两个整数,输出找到的两个整数下标
找出给定数组中和是给定目标整数的两个整数,输出找到的两个整数下标. (本文获得CSDN质量评分[90]) [学习的细节是欢悦的历程] Python 官网:https://www.python.org/ ...
- 给定一个正整数n,计算有多少个不同的连续自然数段
给定一个正整数n,计算有多少个不同的连续自然数段,其中自然数的个数至少为2,其和恰为n. u 例如,当n = 27时,有3 个不同的长度大于等于2 的连续自然数段的和恰为27: 2 + 3 + 4 ...
- 利用matlab,在信号上添加给定SNR(dB)或给定方差的高斯白噪声
利用matlab,在信号上添加给定SNR(dB)或给定方差的高斯白噪声 1. 添加给定SNR的噪声 向信号添加SNR=53dB的高斯白噪声 rng defaultSNR = 53; y = randn ...
- Leetcode06.将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
文章目录 一.题目 二.数学规律法解题思路 1.特殊情况 2.进行周期分析 3.同行相邻点的位置分析 4.注意事项 5.代码实现 三.模拟法 一.题目 将一个给定字符串 s 根据给定的行数 numRo ...
- 【IT笔试面试题整理】给定一个数组a[N]构造数组b [N]
[来源]:腾讯2013实习生笔试 给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]-a[N-1] / a[j],在构造过程中,不允许使用除法:要求O(1)空间复杂 ...
- 【IT笔试面试题整理】给定二叉树先序中序,建立二叉树的递归算法
[试题描述]: 给定二叉树先序中序,建立二叉树的递归算法 其先序序列的第一个元素为根节点,接下来即为其左子树先序遍历序列,紧跟着是右子树先序遍历序列,固根节点已可从先序序列中分离.在中序序列中找到 ...
最新文章
- ThreadPool的使用
- Leet Code OJ 21. Merge Two Sorted Lists [Difficulty: Easy]
- mysql对null排序_mysql中null值的排序问题分析_MySQL
- Opencv imshow显示不出来图片
- Vue内容分发slot
- 网络虚拟化基础一:linux名称空间Namespaces
- mysql GRANT
- iOS tabbar 控制器基本使用
- 2019医学电子书下载PDF电子版下载
- linux 查看ip和路由,Linux route命令详解:查看和操作IP路由表
- SDK接入学习(一):PlayerSetting详解(PC、Mac、Linux)
- 玉品游戏java_整蛊游戏N合一(玉品)
- DC学院数据分析师(入门)学习笔记----高级爬虫技巧
- 【R语言】高维数据可视化| ggplot2中会“分身术”的facet_wrap()与facet_grid()姐妹花
- MD5、SHA1、SHA256、SHA512
- iOS 边学边记 升级ios14 Xcode真机调试启动非常慢的问题解决
- coco人体姿态估计标注软件
- 垃圾邮件识别-朴素贝叶斯算法
- via浏览器如何使用插件 Via浏览器添加使用插件教程
- linux yum pcre安装路径,yum 安装的pcre源码目录在哪