3.12小米笔试
第一题:爬山
首先俺们的Bob在一个风和日丽的日子选择去登珠峰,我们需要在n个特殊的日子(人话就是n天时间内)在大本营找到合适的时间去登山。但是需要知道补给只能维持k天,所以Bob最多只能待k天时间,所以他可能会在不适合爬山的日子撤回到低海拔地区。下撤是需要考虑移动次数的。
所以我们需要算的就是他在低海拔出发低海拔结束,在不错过n个日子且在大本营生活天数不超过k天的前提下最少的移动次数是多少。
思路
首先我们将输入进行拆分,举个例子,[2,3,4,7,8]五天时间,我们拆分为[2,3,4]和[7.8]两个区间,每个连续区间内他都只需要进入一次大本营,离开一次,所以我们区间数(最开始统计到的连续区间)p就是至少需要移动的一半。
接下来我们来优化移动次数
设p为最开始的连续区间数,假设我们停留k天,有n天时间登山,实际上额外停留时间为k - n。所以现在计算非登山日的间隔天数,我们将间隔从小到大排序,尽可能多利用可用额外的停留天数来减少p。具体操作为:
从最小的间隔开始,如果还能住,就可以减少一次移动机会(即合并两个区间),直到不能合并就可以得到p的最后结果即移动次数。
第二题:买车
某人要去买车,需要保证载X人,拉货Y吨,有n种车。
对第i种车价值mi元,有ki种方案,默认拉人xi,拉货yi。第i种方案需要mij元,可以选配件让拉人为xij拉货为yij。但是只能选一种。然后要买多种车需要最少的钱。
思路
相信所有人百分百第一眼看到这题第一反应是,这人有毛病吧!
好我们梳理一下
首先,问题就是至少载X人,至少载Y吨货,然后花费最少。
可以选择的方案有多种,最基本的为mi元,xi人,yi吨。或者别的。
解决方案:
我们把每种汽车和方案都看成一个“物品”,费用就是汽车的价格,收益就是购买某个汽车后它有一定的承载能力。也就是说我们可以直接转化为一个二维费用的完全背包问题。
对于该问题直接采用动态规划。
假设dp[x][y]满足至少x人y吨且花费最小
接下来定义方程
最开始dp[0][0]=0即初始状态。
依次遍历所有的方案(cost, cap_x, cap_y):
完全背包的思想:同一种车买多次,每次购买都会增加承载能力
朴素的完全背包思想:从小到大遍历x, y:dp[min(X, x + cap_x)][min(Y, y + cap_y)] = min(dp[min(X,x+cap_x)][min(Y,y+cap_y)],dp[x][y]+cost)
计算过程就是累计遍历所有的方案逐步更新dp,最后得到的就是最小花费。
这里需要注意我们最后如果值依旧是无穷大则说明无法满足直接返回 -1。
代码详细看我主页www.lx02918.ltd。如果没有说明我还没发(尤其是我这篇刚发出来!)
然后我第二题是没有完全做出来的,时间超了,最后几分钟实在优化不出来了。
首先俺们的Bob在一个风和日丽的日子选择去登珠峰,我们需要在n个特殊的日子(人话就是n天时间内)在大本营找到合适的时间去登山。但是需要知道补给只能维持k天,所以Bob最多只能待k天时间,所以他可能会在不适合爬山的日子撤回到低海拔地区。下撤是需要考虑移动次数的。
所以我们需要算的就是他在低海拔出发低海拔结束,在不错过n个日子且在大本营生活天数不超过k天的前提下最少的移动次数是多少。
思路
首先我们将输入进行拆分,举个例子,[2,3,4,7,8]五天时间,我们拆分为[2,3,4]和[7.8]两个区间,每个连续区间内他都只需要进入一次大本营,离开一次,所以我们区间数(最开始统计到的连续区间)p就是至少需要移动的一半。
接下来我们来优化移动次数
设p为最开始的连续区间数,假设我们停留k天,有n天时间登山,实际上额外停留时间为k - n。所以现在计算非登山日的间隔天数,我们将间隔从小到大排序,尽可能多利用可用额外的停留天数来减少p。具体操作为:
从最小的间隔开始,如果还能住,就可以减少一次移动机会(即合并两个区间),直到不能合并就可以得到p的最后结果即移动次数。
第二题:买车
某人要去买车,需要保证载X人,拉货Y吨,有n种车。
对第i种车价值mi元,有ki种方案,默认拉人xi,拉货yi。第i种方案需要mij元,可以选配件让拉人为xij拉货为yij。但是只能选一种。然后要买多种车需要最少的钱。
思路
相信所有人百分百第一眼看到这题第一反应是,这人有毛病吧!
好我们梳理一下
首先,问题就是至少载X人,至少载Y吨货,然后花费最少。
可以选择的方案有多种,最基本的为mi元,xi人,yi吨。或者别的。
解决方案:
我们把每种汽车和方案都看成一个“物品”,费用就是汽车的价格,收益就是购买某个汽车后它有一定的承载能力。也就是说我们可以直接转化为一个二维费用的完全背包问题。
对于该问题直接采用动态规划。
假设dp[x][y]满足至少x人y吨且花费最小
接下来定义方程
最开始dp[0][0]=0即初始状态。
依次遍历所有的方案(cost, cap_x, cap_y):
完全背包的思想:同一种车买多次,每次购买都会增加承载能力
朴素的完全背包思想:从小到大遍历x, y:dp[min(X, x + cap_x)][min(Y, y + cap_y)] = min(dp[min(X,x+cap_x)][min(Y,y+cap_y)],dp[x][y]+cost)
计算过程就是累计遍历所有的方案逐步更新dp,最后得到的就是最小花费。
这里需要注意我们最后如果值依旧是无穷大则说明无法满足直接返回 -1。
代码详细看我主页www.lx02918.ltd。如果没有说明我还没发(尤其是我这篇刚发出来!)
然后我第二题是没有完全做出来的,时间超了,最后几分钟实在优化不出来了。
全部评论
第一题思路很清晰
相关推荐

点赞 评论 收藏
分享