文章目录

  • 题干
  • 思路
  • 动态规划解法

题干


测试样例

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这段距离...相关推荐

  1. 【组合数学】生成函数 ( 生成函数示例 | 给定通项公式求生成函数 | 给定生成函数求通项公式 )

    文章目录 一.给定级数求生成函数 二.给定生成函数求级数 参考博客 : [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...

  2. 三星笔试能带计算机吗,2021年三星笔试试题+经验谈

    <2021年三星笔试试题+经验谈>由会员分享,可在线阅读,更多相关<2021年三星笔试试题+经验谈(4页珍藏版)>请在人人文库网上搜索. 1.三星笔试试题+经验谈 时间大约3个 ...

  3. Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引

    问题内容是:给定一个数组,给定一个数字.返回数组中可以相加得到指定数字的两个索引. 比如:给定nums = [2, 7, 11, 15], target = 9 那么要返回 [0, 1],因为2 + ...

  4. 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 ...

  5. 两数之和:找出给定数组中和是给定目标整数的两个整数,输出找到的两个整数下标

    找出给定数组中和是给定目标整数的两个整数,输出找到的两个整数下标. (本文获得CSDN质量评分[90]) [学习的细节是欢悦的历程] Python 官网:https://www.python.org/ ...

  6. 给定一个正整数n,计算有多少个不同的连续自然数段

    给定一个正整数n,计算有多少个不同的连续自然数段,其中自然数的个数至少为2,其和恰为n. u  例如,当n = 27时,有3 个不同的长度大于等于2 的连续自然数段的和恰为27: 2 + 3 + 4 ...

  7. 利用matlab,在信号上添加给定SNR(dB)或给定方差的高斯白噪声

    利用matlab,在信号上添加给定SNR(dB)或给定方差的高斯白噪声 1. 添加给定SNR的噪声 向信号添加SNR=53dB的高斯白噪声 rng defaultSNR = 53; y = randn ...

  8. Leetcode06.将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

    文章目录 一.题目 二.数学规律法解题思路 1.特殊情况 2.进行周期分析 3.同行相邻点的位置分析 4.注意事项 5.代码实现 三.模拟法 一.题目 将一个给定字符串 s 根据给定的行数 numRo ...

  9. 【IT笔试面试题整理】给定一个数组a[N]构造数组b [N]

    [来源]:腾讯2013实习生笔试   给定一个数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]-a[N-1] / a[j],在构造过程中,不允许使用除法:要求O(1)空间复杂 ...

  10. 【IT笔试面试题整理】给定二叉树先序中序,建立二叉树的递归算法

    [试题描述]:  给定二叉树先序中序,建立二叉树的递归算法 其先序序列的第一个元素为根节点,接下来即为其左子树先序遍历序列,紧跟着是右子树先序遍历序列,固根节点已可从先序序列中分离.在中序序列中找到 ...

最新文章

  1. ThreadPool的使用
  2. Leet Code OJ 21. Merge Two Sorted Lists [Difficulty: Easy]
  3. mysql对null排序_mysql中null值的排序问题分析_MySQL
  4. Opencv imshow显示不出来图片
  5. Vue内容分发slot
  6. 网络虚拟化基础一:linux名称空间Namespaces
  7. mysql GRANT
  8. iOS tabbar 控制器基本使用
  9. 2019医学电子书下载PDF电子版下载
  10. linux 查看ip和路由,Linux route命令详解:查看和操作IP路由表
  11. SDK接入学习(一):PlayerSetting详解(PC、Mac、Linux)
  12. 玉品游戏java_整蛊游戏N合一(玉品)
  13. DC学院数据分析师(入门)学习笔记----高级爬虫技巧
  14. 【R语言】高维数据可视化| ggplot2中会“分身术”的facet_wrap()与facet_grid()姐妹花
  15. MD5、SHA1、SHA256、SHA512
  16. iOS 边学边记 升级ios14 Xcode真机调试启动非常慢的问题解决
  17. coco人体姿态估计标注软件
  18. 垃圾邮件识别-朴素贝叶斯算法
  19. via浏览器如何使用插件 Via浏览器添加使用插件教程
  20. linux yum pcre安装路径,yum 安装的pcre源码目录在哪

热门文章

  1. 均匀权重向量集合的生成
  2. 嵌入式开发之交叉编译工具链制作
  3. 高并发系统架构案例 - 微信红包高并发架构设计 - 学习/实践
  4. 微信小程序自定义Dialog弹框
  5. Web开发后端框架比较
  6. 轴承系统动力学模型matlab程序代码
  7. IDEA插件开发指南
  8. 贪吃蛇的c语言运行程序,用C语言编写贪吃蛇游戏的程序
  9. 简单将xml数据转换为txt数据
  10. STM32+SIM800C采用MQTT协议登录OneNet上传温湿度、MQ2烟雾浓度、GPS数据