1. 某货品仓库最多存储m件货物,只能从左右两侧取出,现要在移动其他货物次数尽可能少的情况下取出一件某类货物,取出后,其他货物按照原有顺序重新存入,货物间不留空隙。

比如:仓库存储情况列表 a=["0", "A", "A", "B", "B", "A", "0", "0", "0"],其中"0"表示空位,"A", "B"表示位置上货物种类 , 现需从中取出一件B货物,则应从右侧取出,取完后,仓库存储列表更新为a=["0", "A", "A", "B", "A", "0", "0", "0", "0"]。

(1) 若要在上述实例中,再取出一件B货物,则应从 (选填:左侧/右侧)取出。
(2) 实现上述功能的部分python程序如下,请在划线处填入合适代码。

#读取仓库存储情况列表a,最多存储件数 m,代码略

kind=input("请输入货物:")

left=right=0          #left记录从左侧取出此货物时需移动其他物品的次数,right记录从右侧取出此货物时需移动其他物品的次数

i=0;j=m-1

t=[0, 0]              #t表示是否找到此货物

while i<-j and t! =[1, 1]:

    if  :

        i=i+1

    elif a[i]! =kind:

        left+=1

        i=i+1

    else:

        t[0]=1

    if a[j] = =”0”:

        j=j -1

    elif a[j]! =kind:

       

        j=j -1

    else:

        t[1]=1

if left>right:

    for k in range(j , m-1):

        a[k]=a[k+1]

    a[m-1] ="0"

else:

    for k in range(i , 0, -1):

       

    a[0] ="0"

print(a)

【考点】
分支结构语句及程序实现; 循环结构语句及程序实现; 基本数据结构;
【答案】

您现在未登录,无法查看试题答案与解析。 登录
综合题 普通
能力提升
换一批
1. 某银行网点有5个窗口,银行最少要保持3个窗口营业,另2个窗口初始为备用状态。客户按批次进入大厅,每个客户的业务办理时间为1个单位,银行每过1个时间单位就允许下一批客户进入。对于进入银行的客户,如果某窗口正空闲,则可上前办理业务,反之,若所有窗口均有客户,他便会排在最短的队伍后面。当平均每个营业窗口前的队伍人数大于等于7人时(队伍包括正在办理业务的客户在内),银行可临时将备用窗口中一个或两个改为营业窗口,当所有窗口平均客户少于7人时,将立即停用一个营业窗口转为备用,窗口平均人数若继续减少至以上情况,可再停止一个营业窗口,但最多只能有两个窗口为备用状态。

现模拟该银行排队程序,效果如下图所示,输出10个人各自的等待时间单位:

输出格式描述: (客户编号:等待的时间)

(1) 实现上述功能的Python程序如下,请在划线处填入合适的代码。

mins=3    #常用窗口3个

maxs=5    #最多可开设5个窗口

lims=7    #正常服务时每个窗口平均等待的最多人数

tm=int(input("请输人客户共多少批: "))

ps= list(map(int ,input("输人每批客户人数"). split(","))) 

 # list(map(int,["1","2","3"]) )返回:[1, 2, 3]

sw= mins

if len(ps)! = tm:

print("输入有误! " )

pid, cnt=0,0

head, tail=0,0

qe=[[0,0]]* 1000    #创建等待队列

def updatetime(s):

forj in range( len(s)):

s[j][1]+= 1

for i in range(tm):

for j in range(sw):     #将轮到的人进行出队

if  :

print(f’({qe[ head][0]} :{qe[ head][1]})',end=")  #按格式出队输出

head += 1

cnt-=1

#人数减少后,检查人数和窗口数是否符合要求并按照要求减少窗口,代码略

if head!= tail:

  #更新等待队列里每个人的等待时间

for j in range (ps[i]) :

pid+= 1

qe[tail]=[pid,0]

tail += 1

cnt += 1

while  :

sw += 1

while cnt>0:

#最后一批人进入银行后,程序只需要处理等待队列剩余人员到出队

#和窗口的减少,直至人数为0,代码略。

(2) 共有3批客户,分别为22人、23人、21人,则输出结果中,第4个人等待时间单位是
综合题 困难
2. 给定一个m*m 的矩阵,它表示一个箱子的侧视图。箱子的每一个格子的状态可能为图-1所示, 表示钻石, 表示固定的障碍物;将这个箱子顺时针旋转90°,由于重力原因,部分钻石的位置会发生改变。每个钻石会垂直掉落,直到它遇到阻挡(固定的障碍物、另一个钻石或者箱子的底部)。重力不会影响固定障碍物的位置,同时箱子旋转不会产生惯性,也就是说钻石的水平位置不会发生改变。图-2为盒子顺时针旋转90°以后的状态。

如果用数字来表示该矩阵,2表示钻石,1表示固定的障碍物,0表示空位置。随机生成一个m*m的矩阵在listl中显示,点击Command1按钮,按照上述要求旋转90°后的矩阵在list2 中显示。程序运行界面如图-3所示:

(1) 若m=3时,矩阵存储在a中的值为“2,0,1,1,2,0,2,0,0”,顺时针旋转90°后,a(6)中存储的值为
(2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

Constm=6

Dima(1 Tom* m) As Integer     '存储矩阵状态,2代表钻石,1代表固定障碍物,0代表空格

Private Sub Form_ Load()

    '生成初始矩阵保存到a数组并输出到1ist1中,代码略

End Sub

Private Sub Command1_Click()

Dim q(1 To m) As Integer '存储有效空格位置

Dim f As Integer, t As Integer, k As Integer, p As Integer

    f=1:t=1:k=m

    '先模拟钻石下落过程

    For i=1Tom*m

        If  Then

            q(t) = k

            t=t+1

        ElseIf a(k) = 1 Then

           f=1:t=1

        ElseIf f<>t Then,

           

            f=f+1

            a(k) =0

            q(t) = k

            t=t+1

        End If

        If k Mod m=1 Then

            f=1:t=1

            k=k+2*m-1

        Else

            k=k-1

        End If

    Next i

    '顺时针旋转90°后输出

    p=(m-1)*m+1

    For i =1 To m*m

        s=s+Str(a(p))

        If I Mod m=0 Then

            List2. AddItem s

             s=””

             p=

        Else

            p=p-m

        End If

    Next i

End Sub

综合题 困难
3. 在100个小球中,只有一个小球轻于其它小球。如何用没有砝码的天平找出该小球?小安设计了一个三分查找程序来快速查找这个小球,程序认定当需查找的小球个数小于3个时,认为已找到,程序运行界面如图。

Dim a(1 To 100) As Integer

Private Sub Form_Load()

    '产生100个重量为10的小球,存储在数组a中

    '其中随机选取1个小球的重量改为8,代码略

End Sub

Private Sub Command1_Click()

    Dim left As Integer, right As Integer

    Dim mid As Integer, count As Integer

    Dim s(1 To 2) As Integer

    left = 1: right = 100: count = 1

    List2.AddItem Str(left) + "-------->" + Str(right)

    Do While  left<=right

        s(1) = 0: s(2) = 0

            ①   

        i = left: k = 1

        Do While i <= left + mid * 2 - 1

            s(k) = s(k) + a(i)

            If      ②    Then k = k + 1

            i = i + 1

        Loop

        If s(1) = s(2) Then

            left = left + 2 * mid

        ElseIf s(1) < s(2) Then

            right = left + mid - 1

        Else

            

            left = left + mid

        End If

        count = count + 1

        List2.AddItem Str(left) + "-------->" + Str(right)

    Loop

    List2.AddItem "经过" + Str(count) + "次后找到这个数"

End Sub

(1) 实线框处代码有错,请改正。
(2) 请在划线处填入合适代码。

 ② 

(3) 根据上述程序代码,若将虚线框处的两行代码交换一下顺序,则查找结果是(单选,填字母:A .下标越界  /B .找到这个数 /C .找不到这个数  /D .死循环)
综合题 普通