1. 某工厂每天会收到多个订单,有 n 台机器对零件进行加工。为减少机器的损耗,需要在满足所有订单加工的情况下(订单即到即加工),机器开启数量尽量少。若开启 n 台机器不能满足订单即到即加工,则计算所有订单最少的平均等待时间。若给定某天内所有的订单信息,请计算需要开启的机器数量以及订单平均等待时间,代码运行效果图如图所示(注意:若上一个订单结束时间为 9:00,下一个订单开启时间最早为 9:00)。

请回答下列问题:

(1) 上图所示的例子中,若机器有 10 台,则只需要开启台机器。
(2) 定义如下 data_sort(a)函数,参数 a 为列表,列表中每个元素包含三个数据项,依次分别对应订单批次、到达时间、加工时间(时间均转为分钟)。该函数实现将列表a 按照订单到达时间升序排序。

def data_sort(a):

    for i in range(len(a)):

        for j in :

            if   ①    :

                a[j], a[j+1] = a[j+1], a[j]

①划线处填入的语句为,可实现上述功能。

②若将加框处语句写错为 range(i,len(a)-1),则下列 4 组数据中,若列表a 的值为(单选,填字母)不能测试出问题。

A. [['A1',100,30],['A2',120,30],['A3',110,30],['A4',140,30],['A5',130,30]]

B. [['A1',120,30],['A2',110,30],['A3',100,30],['A4',130,30],['A5',140,30]]

C. [['A1',110,30],['A2',140,30],['A3',130,30],['A4',100,30],['A5',120,30]]

D. [['A1',110,30],['A2',120,30],['A3',130,30],['A4',140,30],['A5',100,30]]

(3) 实现计算开启机器数量的部分 Python 程序如下,请在划线处填入合适的代码。

def huan(n):

    #将分钟转换为时间AA:BB 格式,返回值为字符串,代码略#读取文件中的信息,并存储在列表 order 中,代码略data_sort(order)

n=int(input("机器数量:")) for i in range(len(order)):

    order[i].append(-1)#order[i]追加一个元素-1 mach = [-1] * n

num, wait = 0, 0

for i in range(len(order)):

    k = -1

    time = -1

    for j in:

        t1 = mach[j]

        if k == -1:

            k = j

            time = order[t1][1]+order[t1][2]

        else:

            t2 = mach[k]

            if order[t1][1]+order[t1][2]<order[t2][1]+order[t2][2]:

                k = j

                time = order[t1][1]+order[t1][2]

    if k == -1 or num < n and:

        mach[num] = i

        num += 1

    else:

        order[i][3] = mach[k]

        mach[k] = i

        if time > order[i][1]:

            wait += time-order[i][1]

            order[i][1] = time if num < n:

    print("只需开启"+str(num)+"台机器") else:

    print(str(n)+"台机器全部开启,订单平均等待"+str(round(wait/len(order),2))+"min") for i in range(num):

    print('第'+str(i+1)+'台机器:')

    p = mach[i]

    ans = ''

    while p!=-1:

        ans = order[p][0]+':'+huan(order[p][1])+'~'+huan(order[p][1]+order[p][2])+',' + ans

        p = 

    print(ans[:-1])

【考点】
过程与自定义函数; 排序算法及程序实现;
【答案】

您现在未登录,无法查看试题答案与解析。 登录
综合题 困难
能力提升
换一批
2. 某地区举办了一场比赛,共有n个选手参加,每个选手会有m个评委进行评分。现要求按下列规则计算每个选手的成绩,并按照成绩从高到低进行排序。

选手成绩的计算规则是:计算评分最高前k个的平均分avg1,剩余评分的平均分avg2,找到avg1与avg2差值最小,则avg1与avg2的平均数为该选手得分。例如,某选手的评委评分为6,5,3,1,则各位次评分为:

k

1

2

3

avg1

6

5.5

4.67

avg2

3

2

1

avg1-avg2

3

3.5

3.67

由表格可知,差值最小为3,因此该选手的评分为(6+3)/2=4.5。按上述要求,编写VB程序,功能如下:在列表框List1中显示各选手的评委评分,单击“计算”按钮Command1,在列表框List2中依次按照得分从高到低显示每位选手成绩。程序运行界面如图所示。请回答下列问题:

(1) 若某选手的评委评分为6,3,7,10,则该选手最后成绩为
(2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

Const n=8

Const m=12

Dim a(n*m)As Double,b(m)As Integer

Dim f(n)As Double,num(n)As Integer,sum As Double

Private Sub Form_Load()

    '读取n个人每个评委的评分,按照选手编号从小到大依次存入数组a,并显示在List1中

    'a(1)到a(m)存储第1个选手得到的m个评委的评分

    'a(m+1)到a(2*m)存储第2个选手得到的m个评委的评分

    '以此类推,代码略

End Sub

Private Sub Command1_Click()

    Dim i As Integer,j As Integer,x As Integer,k As Integer

    Dim s As Double,avg1AsDouble,avg2AsDouble

    Dim ans_v As Double,ans_c As Double

    For i=1 To n

        sum=0

        For j=1 To m

            sum=sum+a((i-1)*m+j)

            b(j)=0

        Next j

        s=0

        ans_v=-1:ans_c=0

        For j=1 To m-1

            x=find(i)     '找到第i组中m个数中第j大数位置x

           

            avg1=s/j

            avg2=(sum-s)/(m-j)

            If ans_v=-1 Or avg1-avg2<ans_c Then

                ans_v=(avg1+avg2)/2

                ans_c=avg1-avg2

            End If

        Next j

       

        Do While k>=1 And ans_v>f(k)

            f(k+1)=f(k)

            num(k+1)=num(k)

            k=k-1

        Loop

        f(k+1)=ans_v

        num(k+1)=i

    Next i

    '将结果显示在List2中,代码略

End Sub

Function find(t As Integer)As Integer

    Dim i As Integer

    find=0

    For i=(t-1)*m+1 To t*m

        IfThen

            If find=0 Or a(find)<a(i)Then find=i

        End If

    Next i

    b(find-(t-1)*m)=1

End Function

综合题 困难
3. 某运动会100米比赛的晋级规则是根据个人年度最好成绩分组,采用交叉排序法,把成绩好的队员分开到各个小组,保证最优秀的队员能进入最后的决赛。100米比赛分两轮进行:预赛和决赛。预赛:共三个小组,每组8名运动员,取各组的前两名再从剩下18名运动员中取成绩最好的两名共8名进入决赛。决赛跑道分配规则是按预赛成绩的第1名到第8名分别对应第4、5、3、6、2、7、1、8跑道。某同学编写VB程序实现以下功能,点击“决赛名单”按钮将在Listl中显示姓名、预赛成绩和决赛的跑道。程序运行界面如图所示。请回答下列问题:

(1) 根据程序界面和代码,“决赛名单”按钮的“名称”属性值是
(2) 在程序划线处填入合适代码

Dim Group_ score(0 To 24) As Single

Dim Group _name(1 To 24) As String

Dim flag(1 To 24) As Integer

Dim Finals_ name(1 To 8) As String         '参加决赛名单

Dim Finals_ score(1 To 8) As Single        '参加决赛的预赛成绩

Dim First As Integer, second1 As Integer

Private Sub Form Load ()

    '读取三个小组的运动员姓名和预赛成绩(不存在相同成绩),分别存放在Group_ name

    '和Group_ score 数组,其中Group_ name(1) 到Group_ name(8) 、Group_ score(1) 到Group_ score (8)

    '是第1小组运动员的姓名和成绩。以此类推存放第2、3组的数据,并且对flag数组

    '的各元素赋初值为0。代码略

End Sub

Private Sub Comd1_Click ( )

    Dim i As Integer, j As Integer, Left As Integer, Right As Integer

    Dim Temp As Single ,Name As String , runway As String

    runway = "45362718”

    Group_ score(0) = 1000

    For i=1 To 3

    Call search(i, 8)

        Finals_ score(2 * i - 1) = Group_ score (First): Finals_ name (2* i- 1) = Group_ _name (First)

        Finals_ score(2 * i) = Group_ score (second1): Finals_ name(2 *i) = Group_ name (second1)

    Next i

    Call

    Finals_ score(7) = Group_ score (First) :Finals_ name(7) =Group_ name (First)

    Finals_ score(8) = Group_ score (secondl):Finals_ name(8) =Group_ name (second1)

    For i=3 To 8

        Left = 1

        Right =

        Temp = Finals_ score(i) : Name = Finals_ name(i)

        Do While Left <= Right

            m=(Left+Right)\2

            If Finals_ score(i) < Finals_ score(m) Then Right = m- 1

            Else Left=m+ 1

        Loop

        For

            Finals_ score(j) = Finals_ score(j- 1) : Finals_ name (j)= Finals_ name(j - 1)

        Next j

        Finals_ score(Left) = Temp :

        Finals_ name(Left) = Name

    Next i

    For i=1 To 8

        List1. AddItem Finals_ name(i) +””+ Str(Finals_ score(i))+””+ Mid(runway, i, 1)

    Next i

End Sub

Private Sub search(ByVal a As Integer, ByVal b As Integer)

    Dim j As Integer

    First=0:second1=0

    For j =

        If Group_ score(j) < Group_score(First) And flag(j) = 0 Then

            second1 = First

            First = j

        ElseIf Group_ score(j) < Group_ score (secondl) And flag(j) =0 Then

            second1 = j

        End If

    Next j

    flag(First) = 1: flag(second1) = 1

End Sub

(3) 加框处代码有错,请改正
综合题 困难