laravel 先排序后分组怎么写_详解几道 2020 年排序顺序相关的笔试题

dcad8cf53e92444a6dd0ed0d0d49a6bf.png

本文来源于力扣圈子,作者:小白二号,点击查看原文。

力扣​leetcode-cn.com

题目来源:2020 年秋招笔试题(ps: 大家看完题目思考后再看解析)

一、面试题

例题一

鹅厂的下午茶时间!很多人都去公司楼下的星巴克买咖啡,由于买咖啡的人很多,所以就排起了长长的队伍。

队伍当中有 n 个顾客,从 1 到 n 标号,一开始,每个顾客 i 在队伍当中的位置是 i。每个顾客有两个属性

。每个顾客的不满意度等于站在他前面的人与
的乘积,加上站在他后面的人与
的乘积。正式来说,假设顾客位于位置 j,那么它的不满意度等于
作为咖啡店的经理,本着顾客至上的原则,你需要重新安排每个顾客的位置,使得所有的顾客的不满意度的总和最小。

数据:

例题二

公司准备给 n 名用户快递礼物,在甲地和乙地各有个仓库存放了 a 和 b 个这种礼物。从甲地和乙地给每名用户快递礼物的费用是不同的,请计算让 n 名用户都收到礼物的最低总费用是多少?

数据:

分别表示从甲地给第 i 名用户寄礼物和从乙地给第 i 名用户寄礼物的费用

例题三

跑跑卡丁车是一款经典游戏,这款游戏里面有加速带。已知通过每个加速带,卡丁车会获得一个加速度

和加速时间
。现有 n 个连续码放的加速带,你可以任意调整加速带的顺序,问当加速效果全部结束后,卡丁车最多跑出多远?

说明:

  1. 加速带效果不可叠加,已知卡丁车的初始速度为 0。
  2. 所有加速带都是无缝衔接的(即加速带与加速带之间没有缝隙),且小车一开始就被放置于某一加速带。
  3. 根据牛顿运动定律,在每个加速带后卡丁车的位移是

数据:

例题四

你是一个活动晚会的组织者。晚会总的时间长度为 t 分钟,共有 n 个候选节目。每个候选节目有三个值,

表示第
个节目会持续
分钟 。

如果在第

个节目开始时,晚会已经进行了
分钟,那么参与晚会的成员对这个晚会的满意度会增加

你需要在

个候选节目中挑选若干个,并安排在合适的时间,使得晚会满意度达到最大。

要求两个节目的时间不能重叠,且你可以在任意时间安排人员进行任意时长的休息(除了节目进行时),而不会影响满意度。

晚会开始时视做第 0 分钟

数据:

二、解析

这几个题都跟排序有关,而且排序的条件是相对比较隐晦的。

第一题

假设第 i 个顾客位于第 j 个位置,他的不满意度是:

看后面化简后的式子,

是固定不变的,不管顾客位于哪个位置。

后面哪一项是关键,

这一项说明为了使所有顾客的不满意度最小,
越大,
应该越小,
越小,
应该越大。

因此这个题的解法是:按

倒排,最大的排第一位,依次排下去。

第二题

显而易见,如果没有仓库礼物总数这个限制条件,对于第

个用户来说,哪个仓库发货花费少肯定选择哪个仓库,那么我们先根据
的大小关系,对用户先分组,组 1 是甲地发货的用户,组 2 是乙地发货的用户。

那么我们再看仓库礼物总数,如果正好能够满足发货,那么直接按照这个策略发货即可,如果不够,那么考虑把一部分人挪到另一个仓库,怎么挪呢?

我们先假设甲地的礼物总数不够,对于在甲地发货的用户,如果从甲地发货挪到乙地发货,花费需要增加

,为了让总花费最小,挪的用户,是
最小的 k 个用户。

因此这个题的解法是:先按

的大小关系分组,如果甲地的仓库不够发,缺 k 个,那么按
最小的 k 个挪到乙地,如果乙地的仓库不够发,缺 k 个,那么按
最小的 k 个挪到甲地。

第三题:

这个题比较难懂,先来解释一下题目:

加速效果不能叠加,首先卡丁车一开始会被放置在第 1 个加速带,跑出

(一开始速度为0),第1个加速带加速效果结束后,当前速度是
,紧接着第 2 个加速带,跑出
等到加速效果结束后,紧接着又开始第 3 个加速带,等到所有加速效果结束后,问最多能跑出多远。

跟第一题一样,

这一项跟顺序无关,不管排在哪,值都是固定的。我们来展开第一项:

表示加速带的一个排列,目标是使
最大。

观察某两个相邻的加速带,假设我们就拿第一个加速带和第二个加速带来观察,其他加速带位置不变,那么第一个加速带跟第二个加速带哪个排在前面?

第一个加速带排在第二个加速带前面,跟第二个加速带排在第一个加速带前面,代入上述式子,化简:

相当于

对比,继续化简,可得:

,第一个加速带排前面,当
,第二个加速带排前面。

另外,可证明当

交换不会使得
变得更大,因此比较函数
,具备传递性,因此可用排序解决这个问题。

因此这个题的解法是:按加速度 a 排序,加速度大的排前面。

第四题:

这题啊,有两个约束条件:

1. n 个候选节目可选可不选,时间总长度为 t

2. 如果第

个节目开始时,晚会已经进行了
分钟,满意度增加

如果单看第 1 点,没有第 2 点节目开始位置对满意度的影响,那么就是背包问题,动态规划解决。

如果单看第 2 点,没有第 1 点节目长度的限制,那么就是排序问题。

动态规划重要的条件之一,多变量在规划的过程中,中间状态增量更新,不需要重新规划前面已经规划过的变量

如果我们通过排序问题,将节目的前后关系先列出来,就把动态规划的前提条件给构造出来了,即:

如果节目

同时被选中,那么节目
必然排在节目
的前面

我们来求这个结论:假设晚会进行了

分钟,接下来节目
和节目
出现在后面的位置,如果节目
排在前面,满意度增加
,如果节目
排在前面,满意度增加
,两个式子对比,可得,当
,节目
排在前面满意度增量更大,反之,则是节目
排在前面。

因此这个题的解法是:先按

倒序,再按先后顺序进行背包问题求解。

动态规划:令

表示前 i 个候选节目,最后一个节目在时间
结束的最大满意度。

转移方程:

写在最后:

我写完这些题的总结之后,我就在想,排序模型是否可以用数学模型来描述,什么样的题型就得用排序算法。

题目:给定 n 个数,在这 n 个数的所有排列中,求函数

的最大值,函数
是个对数的前后关系敏感的函数。

条件:考察其中两个位置,如果交换能使目标函数更大,那么这个题就可用排序来解决。
特例:

  • 升序排序:
    为排列中的逆序对的数量的相反数
  • 降序排序:
    为排列中的逆序对的数量

排序函数的求法:考察其中两个位置,对比目标函数的增减,可求出排序函数。

本文作者:小白二号

声明:本文归作者版权所有,如需转载请联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值