0816阿里淘天秋招研发岗笔试复盘三道题

#秋招笔面试记录##牛客AI配图神器#

------------------------------------

题目一:

题目大意:
有 n (1 <= n <= 2e5) 本书,编号为 ai (0 <= ai <= 1e9)。你需要将它们放入若干个临时书架(先进先出队列),要求奇数编号和偶数编号的书不能混放。最终,你需要从这些书架中按顺序取出书本,形成一个严格递减的序列。问最少需要多少个临时书架。

解法思路:
奇偶性限制使得奇数和偶数两组书的处理是完全独立的。对于每一组(例如奇数),为了能按顺序取出形成一个严格递减序列,放入同一个书架的书必须是原序列中的一个严格递减子序列。因此,问题转化为:将奇数子序列和偶数子序列分别拆分成最少数目的严格递减子序列。根据Dilworth定理,一个序列最少能被划分成的递减子序列的数量,等于其最长严格递增子序列(LIS)的长度。所以,分别求出奇数序列和偶数序列的LIS长度,两者相加即为答案。LIS可用经典的O(n log n)算法求解。

------------------------------------

题目二:

题目大意:
有 n (1 <= n, m <= 1000) 个部门和 m 个项目,部门权重为 ai,项目难度为 bj (1 <= a, b <= 1e4)。还有一个 n x m 的绩效矩阵 vij (1 <= v <= 1e4)。总绩效为所有 wij = vij * (ai + bj) 的和。你可以任意交换部门的顺序(行和a的顺序),也可以任意交换项目的顺序(列和b的顺序),目标是最大化总绩效。

解法思路:
关键在于对总绩效公式进行数学变形。总绩效 = Sum(vij * (ai + bj)) = Sum(vij*ai) + Sum(vij*bj)。将求和顺序改变可得:Sum(ai * Sum_j(vij)) + Sum(bj * Sum_i(vij))。这等价于 `部门权重向量a` 与 `矩阵行和向量` 的点积,加上 `项目难度向量b` 与 `矩阵列和向量` 的点积。根据排序不等式,两个向量的点积在它们同序排序时最大。因此,先计算出矩阵的所有行和与列和。然后,将部门权重a和行和向量都按降序排序后计算点积,再将项目难度b和列和向量都按降序排序后计算点积,两者相加即为最大总绩效。

------------------------------------

题目三:

题目大意:
有 n (1 <= n <= 1e5) 个服务区域,每个区域是数轴上的一个闭区间 [li, ri] (|li|,|ri| <= 1e9)。你需要选择一个整数点 x 作为仓储中心,使得总运输成本最小。单个成本定义为:如果 x 在区间内,成本为0;否则成本是 x 到该区间最近端点的距离。

解法思路:
这是一个经典的几何中位数问题。总成本函数是所有单个成本函数的和,而每个单个成本函数 `cost(x)` 都是一个V形的凸函数。多个凸函数之和仍然是凸函数,其最小值点可以通过分析斜率变化找到。总成本函数的斜率在每个区间的端点 `li` 和 `ri` 处发生变化。当 x 从负无穷向正无穷移动时,初始总斜率为-n,每经过一个端点,斜率就加1。当斜率从负数变为非负数时,就到达了成本最小的位置。这个位置恰好是所有 `2n` 个端点(所有 `li` 和 `ri` 的集合)的中位数。因此,只需收集所有 `2n` 个端点,找到它们的中位数作为最优选址x,然后计算总成本即可。

具体的详细代码和题解可以戳我主页的文章查看
全部评论
接好运
点赞 回复 分享
发布于 08-16 23:45 北京

相关推荐

08-15 18:01
已编辑
美团_后端(实习员工)
bg学院本末9硕,6月18日在小红书上看到白袜哥宣传后私信,加入学习,当时项目有做黑马点评和外卖,算法刷了hot100,看了一些小林coding的八股,只是面试全挂了。但基础还行,只缺项目和补一下八股,所以学到7月初开始投,7月9日第一次面试美团,到8月1日前还面过快手、京东、字节、滴滴,但全都挂在了一面,答的很好也挂了。小红书本来hr都要约面了,又说有人已经接offer了所以流程中止,丢失面试机会。挫败感还是比较大的,都有点怀疑人生了,白袜哥跟我说是现在hc少,让再沉淀沉淀,但还是觉得很抑郁,明明都准备好了就是没过一面,找白袜哥聊,跟我讲了很多,现在印象比较深的就是他说暑期有合工大硕0实习一面放水,二面被拷打的完全答不出还是过,三面直接聊天躺赢进字节的故事,但还是觉得意难平,主要是在身边发生,一下有点接受不了。二战转折点在下午,面美团感觉相当好,问的所有问题都答出来了,但又有点担心跟之前一样面的好也挂,但这次并没有,面完半小时hr就打来了电话,问我什么可以到岗,有没有其他流程,如果给了offer会不会去,转折来的太突然让我反复怀疑真的面过了吗,即使白袜哥说这就是oc我还是持保留态度,只是把加了hr微信后的聊天记录发他确保沟通不踩雷,然后每隔一段时间刷新下状态翘首以盼。8月3日还出现了插曲,官网显示面试不通过,差点又道心破碎了,问白袜哥是什么情况,他的答复是美团校招官网经常出奇奇怪怪的bug,比如他暑期教的一个双9面美团时拿到的是那个人三年前本科投美团暑期的简历,但我还是怕变成一场空,就按他的意思去问hr,得到的回应是并没有挂,8月1日就已经推进了流程,只是要过周末,于是在忐忑不安中度过了周末。周一上午美团offer终于来了,悬着的心也是彻底放下。整个过程不是很长,但确实很提心吊胆,最后的offer也是一波三折,开始以为又会跟之前一样寄掉,知道要拿offer了开始高兴,看到官网面试未通过的崩溃,最后终于收到offer的释怀还是感谢下白袜哥在回答疑问之余还耐心的听我发牢骚,咏袜@黑皮白袜臭脚体育生8.15更新&nbsp;补聊天记录
学一下吧现在太菜了:刚面完美团,2道dp一道图论,都有原题,八股也是问一些简单的。面完一面就过了,完事之后美团领导就给发了offer,还给了一个头盔一套制服,不过领导说了,这年头电动车要自己买。
点赞 评论 收藏
分享
------------------------------------题目一:题目大意:有&nbsp;n&nbsp;(1&nbsp;&lt;=&nbsp;n&nbsp;&lt;=&nbsp;2e5)&nbsp;颗宝石,每颗有能量值&nbsp;ai&nbsp;(-n&nbsp;&lt;=&nbsp;ai&nbsp;&lt;=&nbsp;n)。你可以执行任意次“融合”操作:选择两颗宝石&nbsp;i&nbsp;和&nbsp;j,将&nbsp;j&nbsp;的能量转移给&nbsp;i&nbsp;(ai&nbsp;=&nbsp;ai&nbsp;+&nbsp;aj,&nbsp;aj&nbsp;=&nbsp;0)。目标是最大化所有位置的前缀最大能量值之和,即&nbsp;sum(max(a1,&nbsp;...,&nbsp;ai))&nbsp;for&nbsp;i=1&nbsp;to&nbsp;n。(T&nbsp;组数据,&nbsp;1&nbsp;&lt;=&nbsp;T&nbsp;&lt;=&nbsp;1e4)解法思路:关键在于理解融合操作的本质是能量的自由分配。为了最大化前缀最大值之和,最优策略是创造一个尽可能大的数,并放在首位。如果数组中存在正数,就把所有正能量的宝石融合到第一颗上,使其能量变为所有正数之和,其余位置变为0或负数。这样每个前缀的最大值都是这个正数之和。如果所有宝石能量都是非正数,若&nbsp;n&gt;1,则可以通过融合操作造出一个0,使前缀最大值变为0;若&nbsp;n=1,则无法操作,答案就是其本身的负能量值。------------------------------------题目二:题目大意:在一片&nbsp;n&nbsp;x&nbsp;n&nbsp;(2&nbsp;&lt;=&nbsp;n,&nbsp;m&nbsp;&lt;=&nbsp;1e6)&nbsp;的森林中,有&nbsp;m&nbsp;名探险者和&nbsp;n&nbsp;个救援站。救援站位于对角线&nbsp;(i,&nbsp;i)&nbsp;上,每个站只能救一人。探险者会去距离自己最近(曼哈顿距离)的救援站。如果有多个最近的,他们会协调分配以最大化获救人数。求最多能获救的人数。解法思路:此题可转化为区间选点问题。对于一个在&nbsp;(x,&nbsp;y)&nbsp;的探险者,其到对角线上救援站&nbsp;(k,&nbsp;k)&nbsp;的曼哈顿距离为&nbsp;|x-k|&nbsp;+&nbsp;|y-k|。可以发现,当&nbsp;k&nbsp;落在&nbsp;[min(x,y),&nbsp;max(x,y)]&nbsp;区间内时,距离是最小且恒定的。因此,每个探险者对应一个可选的救援站区间。问题就变成了:有&nbsp;m&nbsp;个区间,n&nbsp;个点,每个点最多被一个区间选择,求最多能满足多少个区间。这是一个经典的贪心问题:将所有区间按右端点升序排序,然后遍历区间,为每个区间贪心地分配其范围内最靠左的可用救援站。使用并查集可以高效地找到下一个可用的位置。------------------------------------题目三:题目大意:有&nbsp;n&nbsp;(1&nbsp;&lt;=&nbsp;n,&nbsp;q&nbsp;&lt;=&nbsp;1e5)&nbsp;个魔法水晶,能量为&nbsp;ai&nbsp;(1&nbsp;&lt;=&nbsp;ai&nbsp;&lt;=&nbsp;1e5)。需要处理&nbsp;q&nbsp;次操作,操作分两种:1.&nbsp;将第&nbsp;i&nbsp;个水晶的能量修改为&nbsp;x;2.&nbsp;查询区间&nbsp;[l,&nbsp;r]&nbsp;内所有水晶能量的波动度(方差)。方差定义为&nbsp;(1/m)&nbsp;*&nbsp;sum((bi&nbsp;-&nbsp;mean)^2)。解法思路:直接计算方差涉及均值,不便于用数据结构维护。关键是对方差公式进行数学变换:Var(X)&nbsp;=&nbsp;E(X^2)&nbsp;-&nbsp;(E[X])^2。对于一个区间,这等价于`(区间平方和&nbsp;/&nbsp;区间长度)&nbsp;-&nbsp;(区间和&nbsp;/&nbsp;区间长度)^2`。这样,我们只需要维护区间的和与区间的平方和。这可以用两个树状数组(或线段树)来高效实现:一个树状数组维护&nbsp;`sum(ai)`,另一个维护&nbsp;`sum(ai^2)`。单点修改时,在这两个树状数组上都进行更新。区间查询时,分别查出区间和与区间平方和,再代入公式计算即可。具体的详细代码和题解可以戳我主页的文章查看
投递阿里巴巴集团等公司10个岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务