当前位置: 高中信息技术 / 综合题
  • 1. (2021高二下·温州期末) 某旅行团需在酒店预订一批房间,要求所预订的房间号码尽量集中,如果有多种方案,优先选择预订房间数目较少的方案,有多组可选方案时选择起始房间号最小的方案。酒店有单人间和双人间两种房间,b 数组按房间号顺序存储该房间可入住人数,其中可入住人数为0 时,表示该房间已有人入住,不可预订。比如有16 个房间可入住人数如下:

    房号

    i

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    人数

    b(i)

    2

    0

    2

    2

    0

    1

    2

    1

    2

    1

    0

    2

    1

    0

    2

    2

    下表给出了选择预订房间的过程(区间长度表示预订房间的起始房号到最后一个房号包含的房间数,区间长度值越小,代表预订房间分布越集中),选择最优方案过程如1)2)3)所示

    1)从房间号码分布区间长度值最小原则,选择方案2、4、9

    2)分布区间长度值相同时,选择预订房间数目最小的,因此选择方案2、9

    3)所有可选方案中,优先选择最先成立的(起始房号最小的)方案,最终选择方案2

    程序运行界面如下,请完成相应的小题

    1. (1) 如下图所示16个房间,当入住人数为5人时,预订房间号是:
    2. (2) 请在划线处填写适当的代码

      Const n = 16      '假设酒店总房间数为16

      Dim b(1 To n) As Integer      'b数组按房间号顺序存储各房间可入住人数

      Function find1(x, y) As Integer

          '函数find1(x,y)的作用是从b(x)到b(y)中找到值为1的数组变量的下标,若找不到,返回值为0

      End Function

      Private Sub Command1_Click( )

          Dim s As Integer d As Integer, f as integer, num As Integer, roomnum As Integer

          Dim minnum as integer      'minnum 变量存储当前最优方案中的预订房间数目

          Dim mindist As Integer      'mindist 存储当前的最小分布区间长度

          '所有房间的可入住人数按房间号码顺序存储到数组b 中并显示在list1 中,代码略

          num = Val(Text1.Text)

          minnum = n: mindist = n :s = 0 : start = 0: f = 0: pos = 0

          For i = 1 To n

              If b(i) <> 0 Then

                  j = i: s = 0: roomnum = 0

                  Do While s < num And j <= n

                      s = s + b(j)

                      If b(j) > 0 Then roomnum = roomnum + 1

                      j = j + 1

                  Loop

                  d =

                  If s = num Then

                      If d < mindist Or  Then

                          start = i: mindist = d: minnum = roomnum: pos = 0

                      End If

                      ElseIf s > num Then     '若可入住人数超出,在当前区间内所选房间中取消1个单人间

                      f = find1(i + 1, j - 2)

                      If f > 0 Then

                          If d < mindist Or d = mindist And roomnum-1 < minnum Then

                              start = i: mindist = d: minnum = roomnum - 1: pos = f

                          End If

                      End If

                  End If

              End If

          Next i

          If start = 0 Then

              Label2.Caption = "房间数量不足"

          Else

              List2.AddItem "预订房间:" + Str(minnum) + "间"

              For i = start To

                  If b(i) > 0 And i <> pos Then

                      List2.AddItem "房间号:" + Str(i) + ",入住人数:" + Str(b(i))

                  End If

              Next i

          End If

      End Sub

微信扫码预览、分享更方便