深耕专业教研,探索前沿技术
信息技术来源:2026年4月杭州二模技术试卷

第 15 题

答案与解析

第(1)小题

参考答案

3

每趟搬运 k 件货物需用 k+3 个单位时间,且 k≤10。图 a 中允许在时刻 15 完成,本题也按不晚于截止时刻 15 计算。

先看 2 辆叉车:订单 1 在时刻 0 开始,叉车 1 尽可能装 10 件,到时刻 13 完成;叉车 2 装余下 5 件,到时刻 8 完成。处理订单 2 时,最早空闲的是叉车 2,从时刻 8 开始,预留搬运所需的 3 个单位时间后,只能再装 15-8-3=4 件,订单 2 尚余 8 件。叉车 1 到时刻 13 才空闲,此时连装 1 件并运走所需的 4 个单位时间都不够,所以 2 辆不能完成。1 辆连订单 1 的第二趟也来不及完成,因此至少需要 3 辆。

使用 3 辆时,可按规则完成以下调度:

订单 叉车编号 本趟件数 开始时刻 完成时刻
1 1 10 0 13
1 2 5 0 8
2 3 8 4 15
2 2 4 8 15

处理订单 2 时,叉车 3 尚未使用,最早空闲,但需等到订单的装货时刻 4 才能开始;它最多装 15-4-3=8 件。剩余 4 件交给时刻 8 空闲的叉车 2,恰好在时刻 15 完成。3 辆可行,且 2 辆不可行,故最少需要 3 辆。

第(2)小题

参考答案

C

解题思路

两层循环反复比较相邻订单,条件成立时交换,内层比较范围随外层轮次缩小,这是冒泡排序的结构。题目已保证装货时间升序,本题只需调整同一装货时间内的货物数量顺序。

程序分析

def psort(data):
    for i in range(len(data)-1):
        for j in range(len(data)-i-1):
            if :
                data[j], data[j+1] = data[j+1], data[j]
    return data

相邻订单 data[j]、data[j+1] 中,下标 0 的数据项是装货时间,下标 1 的数据项是货物数量。交换语句交换整个订单,因此方框条件既要限制哪些订单可以交换,也要判断它们的货物数量是否次序颠倒。

填空分析

方框

要保持已有的装货时间升序,只有相邻订单装货时间相同时才允许交换,即 data[j][0] == data[j+1][0]。同一时间内要求货物数量降序,左侧数量小于右侧数量时才应交换,即 data[j][1] < data[j+1][1]。两项条件必须同时成立,用 and 连接,得到:

data[j][0] == data[j+1][0] and data[j][1] < data[j+1][1]

对应选项 C。

第(3)小题

参考答案
  1. count = data[i][1]

  2. cars[mini] = stime + load + 3

  3. left > n

程序分析

data = psort(data)
v = 10       #叉车最大装货量
left, right = 1,n
while left <= right:
    m = (left + right) // 2
    if check(data, m, v, t):
        ...
    else:
        ...

主程序先按第(2)问的规则排列订单,设每趟容量v=10,查找范围为1~n辆叉车。每轮取对分点m,将m传入check,用函数的返回值决定下一轮查找范围。

def check(data, m, v, t):
    cars = [0] * m
    for i in range(len(data)):
        ①
        while count > 0:
            ...
    return True

check建立含m个元素的列表cars,各项初值为0。外层for循环依次处理各个订单;内层while循环在count>0时重复执行,全部循环结束后返回True。

mini = findi(cars)
stime = max(cars[mini], data[i][0])    #max(a,b)返回a,b的最大值
remain = t - 3 - stime
if remain <= 0:
    return False

findi先以列表下标0为候选,从小到大比较cars中的值,只在发现更小值时更新mini,因此返回最小值首次出现的下标。结合“选择最早空闲叉车,同样空闲时选择编号最小的叉车”的规则,cars中的值应表示各叉车的空闲时刻,下标对应叉车编号减1,初值0表示开始时全部叉车空闲。

stime取cars[mini]与订单装货时间data[i][0]中的较大值,表示既要等所选叉车空闲,也要等订单允许装货,才能开始本趟作业。截止前预留3个单位时间搬运,remain=t−3−stime就是剩余可用于装货的时间;每件装货耗时1,它也对应截止前最多可装的件数。若remain≤0,最早空闲的叉车也来不及装运1件,函数返回False。

load = min(count, remain, v)    #min(a,b,c)返回a,b,c的最小值
②
count -= load

load取count、remain、v中的最小值,并在本趟结束后从count中扣除。由此可知,count记录当前订单剩余的货物数量,load是在剩余件数、剩余时间和单趟容量三项限制下,本趟可装的最多件数。count减至0后,程序才进入下一订单;空②还需使下一轮选车时采用更新后的空闲状态。

while left <= right:
    m = (left + right) // 2
    if check(data, m, v, t):
        right = m - 1
    else:
        left = m + 1

check按给定规则模拟调度,无法继续装运时返回False,全部订单处理完成后返回True。若m辆可完成,继续向左查找更少的叉车数量,令right=m−1;若m辆不能完成,则向右查找,令left=m+1。循环结束后,若1~n中存在可行数量,left就是最小可行值;若n辆仍不能完成,left会越过n,成为n+1。

填空分析

①

空①位于处理新订单的for循环内、逐趟扣减的while循环外。每个订单开始时,应以该订单的货物总量初始化count,因此填入:

count = data[i][1]

②

本趟从stime开始,装load件耗时load,再用3个单位时间搬运,所选叉车将在stime+load+3时重新空闲。把这一时刻写回cars中对应项:

cars[mini] = stime + load + 3

以stime为起点,包含了等待订单装货时间的情况;由load≤remain=t−3−stime,可知本趟完成时刻不晚于t,与图a的截止时刻口径一致。

③

现有叉车最多n辆,只有left>n才表示查找范围内没有可行数量,因此填入:

left > n

left=n表示需要用满现有叉车,仍可完成订单。