今天练习的是顺丰最新机考笔试题2题。
各大厂真题都整理了近两年的机考题,题库里面有详细思路和答案~
肥猫学长也提供机考辅导助攻(100%通过率)和面试辅导欢迎咨询。
微信号:jackwwang8
目前已经整理的题库有如下:如果有需要可以加我微信获取哦~
顺丰-27届秋招题目8.23
第1题 告警级别准入门槛
题目描述
运维侧汇总评估得到
对门槛
若没有满足条件的记录,则
取
输入描述
数据范围:
输出描述
输出一个整数,表示最小合法门槛
样例
输入:
3 64 27 51 3输出:
5说明:当
解题思路
门槛增大时,满足
为了快速计算任意门槛对应的额度和,先将所有记录按照级别升序排列,并建立额度前缀和。对于一个候选门槛bisect_left 找到第一条级别不小于
二分区间取
这种写法不需要单独合并相同级别。排序后,二分查找会自然跳到该级别所有记录之前,仍能正确计算总额度。
复杂度分析
更加详细解题思路和 CPP、Java 代码加我微信获取:jackwwang8from bisect import bisect_left
import sys
def minimum_threshold(records, budget):
records.sort(key=lambda item: item[0])
levels = [level for level, _ in records]
prefix_cost = [0]
for _, cost in records:
prefix_cost.append(prefix_cost[-1] + cost)
total_cost = prefix_cost[-1]
def included_cost(threshold):
first_included = bisect_left(levels, threshold)
return total_cost - prefix_cost[first_included]
left = 0
right = levels[-1] + 1
while left < right:
middle = (left + right) // 2
if included_cost(middle) <= budget:
right = middle
else:
left = middle + 1
return left
def main():
input_data = sys.stdin.readline
record_count, budget = map(int, input_data().split())
records = [
tuple(map(int, input_data().split()))
for _ in range(record_count)
]
print(minimum_threshold(records, budget))
if __name__ == "__main__":
main()
第2题 最小缺货总件数
题目描述
共有
在时刻
每次出库时,可以任意选择取出哪些有效物品。请合理安排,使所有时刻缺货件数之和最小,并输出该最小值。
输入描述
数据范围:
输出描述
输出一个整数,表示最小缺货总件数。
样例
输入:
33 4 32 1 11 3 1输出:
2说明:时刻
解题思路
每次出库都应优先使用最早过期的库存。假设当前有两批库存,过期时刻分别为
实现时,用小根堆保存当前存在的过期时刻,再用字典记录每个过期时刻对应的库存总量。这样,同一过期时刻的多批货物会自动合并,不需要在堆中保存多份相同节点。
对每个时刻依次执行:
数组中的数量可能达到
复杂度分析
更加详细解题思路和 CPP、Java 代码加我微信获取:jackwwang8import heapq
import sys
def minimum_shortage(expire_input, arrivals, demands):
active_deadlines = []
stock_by_deadline = {}
total_shortage = 0
for day, (expire_value, arrival, demand) in enumerate(
zip(expire_input, arrivals, demands),
start=1,
):
while active_deadlines and active_deadlines[0] < day:
expired = heapq.heappop(active_deadlines)
stock_by_deadline.pop(expired, None)
deadline = expire_value - 1
if arrival > 0 and deadline >= day:
if deadline not in stock_by_deadline:
stock_by_deadline[deadline] = 0
heapq.heappush(active_deadlines, deadline)
stock_by_deadline[deadline] += arrival
remaining_demand = demand
while remaining_demand > 0 and active_deadlines:
nearest_deadline = active_deadlines[0]
available = stock_by_deadline[nearest_deadline]
used = min(remaining_demand, available)
remaining_demand -= used
available -= used
if available == 0:
heapq.heappop(active_deadlines)
del stock_by_deadline[nearest_deadline]
else:
stock_by_deadline[nearest_deadline] = available
total_shortage += remaining_demand
return total_shortage
def main():
input_data = sys.stdin.readline
time_count = int(input_data())
expire_input = list(map(int, input_data().split()))
arrivals = list(map(int, input_data().split()))
demands = list(map(int, input_data().split()))
print(minimum_shortage(expire_input, arrivals, demands))
if __name__ == "__main__":
main()

扫描它,然后带走我:

微信号| jackwwang8
bilibili| 养只猫一米哒
小红书| 2878931801
夜雨聆风