牛客网:牛牛送冰淇淋
链接:https://ac.nowcoder.com/acm/contest/6630/C
来源:牛客网
牛牛公司老板让牛牛负责m个冰激凌的运输。运输车的冷库只够装n个冰激凌,一次运输需要t分钟,返回也需要t分钟。每个冰激凌制作好有一个时间。牛牛想知道最短运输完所有冰激凌的时间,以及在时间最短的情况下最少运输次数。
示例1
输入
2,3,10,[10,30,40]
输出
[50,2]
备注:
(1≤n,m,t≤2000)
思路:
动态规划,本题的关键在于如何将问题抽象到动态规划模型之中,即如何利用动态规划的解题思路来理解题目。
1. 确定状态。对于题目来说,需要求两个最优的值,而比较迷惑的是,对于最少运输次数而言,与运送时间最短的关系并不相关。换句话说,对于取得最短运送时间的运送次数,一定是所有运送方案中运送次数最少的。证明如下:对于n号冰激凌来说,要完成它的运送至少是在n+t的时间完成,那么在这之前,不可能存在一种方案能够使得这个时间提前,也就是说在这之前的最少的方案就是贪心的运送方案。因此使用两个dp数组:dp[]和ctimes[]分别记录最短时间和最少次数。
2. 写到这儿发现并不需要动态规划,n个一车拉就完事了;
3. 但是还是把动态规划的思路写完,确定状态转移方程,对于最短时间来说,dp[i]应该是等于,dp[i] = min(dp[i],max(dp[j]+t,c[i])+t);怎么理解呢,就是在之前的i之前的n个(存在一车一起拉走的可能性),n个他们送完之后再送i和他们等着i一起送这两者之间较大的,这n个中的最小值。
4. 确认初始值。dp[0]原本应该等于0,但是在本题中,根据递推公式来说,dp[1]如果需要等于c[1]+t,那么dp[0]+t就一定需要小于c[1]。所以dp[0]=-t(理论上小于-t也可以)。ctimes[0]=0,ctimes[1]=1。
动态规划方法
class Solution {public:/*** 两个数表示答案* @param n int整型 一次运输的冰激凌数量* @param m int整型 总冰激凌数* @param t int整型 一次运输的时间* @param c int整型一维数组 表示每个冰激凌制作好时间<1e4* @param cLen int c数组长度* @return int整型vector*/vector<int> icecream(int n, int m, int t, int* c, int cLen) {vector<int> dp(2020,INT_MAX);vector<int> ctimes(2020,INT_MAX);// write code heresort(c,c+cLen);for(int i=cLen;i>=1;i--){c[i] = c[i-1];}c[0]=0;dp[0] = -t;ctimes[0]=0;ctimes[1]=1;for(int i = 1;i<=m;i++){for(int j = max(0,i-n);j<i;j++){dp[i] = min(dp[i],max(dp[j]+t,c[i])+t);ctimes[i] = min(ctimes[j]+1,ctimes[i]);}}return {dp[m],ctimes[m]};}
};
贪心方法:
class Solution {public:/*** 两个数表示答案* @param n int整型 一次运输的冰激凌数量* @param m int整型 总冰激凌数* @param t int整型 一次运输的时间* @param c int整型一维数组 表示每个冰激凌制作好时间<1e4* @param cLen int c数组长度* @return int整型vector*/vector<int> icecream(int n, int m, int t, int* c, int cLen) {// write code heresort(c,c+cLen);int ans = -t;int start = (m%n)?(m%n):n;for(int i = start-1;i<m;i+=n){ans+=t;ans = max(c[i],ans);ans+=t;}return {ans,m/n+((m%n)!=0)};}
};
牛客网:牛牛送冰淇淋相关推荐
- 牛客网——牛牛的通勤
帮朋友写个题解 目录 前言 一.牛牛的通勤 描述 输入描述: 输出描述: 总结 前言 最后一场雨停歇之后,我出发了.空气因为我的目光而发亮.秘密小径也露出了轮廓.树林静静地等候--他们听说过我和你的约 ...
- 牛客网--牛牛的闹钟
牛牛总是睡过头,所以他定了很多闹钟,只有在闹钟响的时候他才会醒过来并且决定起不起床.从他起床算起他需要X分钟到达教室,上课时间为当天的A时B分,请问他最晚可以什么时间起床 输入描述: 每个输入包含一个 ...
- 牛客网--牛牛找工作
题目描述 为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬.牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作.在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作, ...
- 牛客网牛牛换瓷砖的编程题
牛牛喜欢彩色的东西,尤其是彩色的瓷砖.牛牛的房间内铺有L块正方形瓷砖.每块砖的颜色有四种可能:红.绿.蓝.黄.给定一个字符串S, 如果S的第i个字符是'R', 'G', 'B'或'Y',那么第i块瓷砖 ...
- 牛客网 牛牛数括号(DP)
题目连接 题意 题干已经说的很清楚 给你两个括号序列,不保证合法,求有多少种不同的方法可以将两个括号序列合并成一个合法的括号序列 合并的时候不能改变各自序列原先的顺序 思路 dp[i][j] 表示s1 ...
- codeforces(牛客网dp专题,排序)
链接:https://ac.nowcoder.com/acm/problem/21314 来源:牛客网 牛牛正在打一场CF 比赛时间为T分钟,有N道题,可以在比赛时间内的任意时间提交代码 第i道题的分 ...
- 牛客网:牛牛玩平板(c++)
链接:牛牛玩平板 来源:牛客网 题目描述 牛牛和牛妹喜欢玩平板游戏,游戏一开始屏幕上会出现很多个图形,玩家在每一轮可以合并两个图形,当只有一个图形的时候游戏结束,每个图形都有一个大小,合并完成后的图形 ...
- 牛牛爱奇数 来源:牛客网
题目 链接:https://ac.nowcoder.com/acm/contest/28886/1016 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K, ...
- 手把手带你学python—牛客网python基础 牛牛的逻辑运算
牛客是一款不论是面试 还是刷题 都是非常有用的 还等什么,传送门- 牛客网python基础
最新文章
- matlab 2016b更改工作路径
- oracle中extents存在的理由
- 【Android】Android Service 服务
- 强制消除Xcode警告的方法
- 复习--linux目录及文件操作
- c语言直流电机控制实验报告,直流电机实验报告.docx
- oracle数据库同步异步优劣点,ORACLE数据库异步IO介绍
- 推荐几个好用的php集成开发环境,推荐几个好用的PHP集成开发环境 (2
- 国内首家,携程试点每周两天居家办公反响热烈,76%的员工主动报名
- 浅析物联网及云计算技术在传统汽车检测线中的应用
- C# 调用 dll 文件
- 如何利用模型对大客户风险评估——信用额度进行推测
- win10重装系统打开分区或者磁盘提示无法访问解决办法
- ppt编辑器android,ppt编辑器
- linux空目录4kb,为什么 Linux 默认页大小是 4KB
- div+css静态网页设计 电商购物网站设计(55页) 电商网页设计制作 简单静态HTML网页作品 购物网页作业成品 学生商城网站模板
- Codeforces1509.B. TMT Document
- IT新手入职的一些注意事项
- Linux下生产者与消费者模型
- 阿里企业邮箱526 Authentication failure
热门文章
- [Excel启用编辑]的影响与关闭
- 基于Scrapy框架爬取豆瓣《复联4》影评,并生成词云
- PrimoCache2.2.0汉化程序与2.0.0的交叉使用
- 使用java实现鱼刺图
- 钛媒体乌镇咖荟 | 数字化改变以流量为核心的平台生态,系统性思维的价值开始显现...
- boost::string_algo库详解
- CVPR ECCV ICCV论文汇总
- 广度优先搜索BFS-P3456 [POI2007]GRZ-Ridges and Valleys
- 初中计算机课师徒结对活动记录,师徒结对活动记录表10张(师傅尚积东徒弟丁明路)(备课6节听课4节).doc...
- 短期目标:三月、四月、五月