某旅行团需在酒店预订一批房间,要求所预订的房间号码尽量集中,如果有多种方案,优先选择预订房间数目较少的方案,有多组可选方案时选择起始房间号最小的方案。酒店有单人间和双人间两种房间,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、4、9。
(2)分布区间长度值相同时,选择预订房间数目最小的,因此选择方案2、9。
(3)所有可选方案中,优先选择最先成立的(起始房号最小的)方案,最终选择方案2。
方案 | 房号范围 | 区间长度 | 房间数目 | 备注 | 方案 | 房号范围 | 区间长度 | 房间数目 | 备注 |
方案1 | 1~6 | 6 | 4 | 方案6 | 8~13 | 6 | 5 | ||
方案2 | 3~7 | 5 | 4 | 方案7 | 9~15 | 7 | 4 | 人数>7,取消10号房 | |
方案3 | 4~9 | 6 | 4 | 人数>7 取消6号单人间 | 方案8 | 10~16 | 7 | 4 | 人数>7,取消13号房 |
方案4 | 6~10 | 5 | 5 | 方案9 | 12~16 | 5 | 4 | ||
方案5 | 7~12 | 7 | 4 | 人数>7,取消8号单人间 |
(1)如下图所示16个房间,当入住人数为5人时,预订房间号是:
7,8,9
7,8,9
。
(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=
j-i
j-i
If s=num Then
If d<mindist Or
d=mindist and roomnum<minnum
d=mindist and roomnum<minnum
Thenstart=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
start+mindist-1
start+mindist-1
If b(i)>0 And i<>pos Then
List2.AddItem“房间号:“+Str(i)+“,入住人数:“+Str(b(i))
End If
Next i
End If
End Sub
【考点】顺序存储结构.
【答案】7,8,9;j-i;d=mindist and roomnum<minnum;start+mindist-1
【解答】
【点评】
声明:本试题解析著作权属菁优网所有,未经书面同意,不得复制发布。
发布:2024/6/27 10:35:59组卷:3引用:1难度:0.3
相似题
-
1.在一个文档中,每行包含一个字符串。现使用如下规则对其压缩:压缩时,对于每个字符串求其与前一字符串的公共前缀,然后使用公共前缀的长度和字符串的剩余部分(以空格隔开)表示该字符串,每个空格和字符都会占用一个字节空间。图a所示为该压缩规则示意图。小明为此编写了VB程序,功能如下:运行程序时,在列表框List1中显示原字符串内容,单击“压缩”按钮Command1,在列表框List2中显示压缩后字符串,并在标签Label2中显示压缩后容量。程序运行界面如图b所示。
实现上述功能的 VB 代码如下,但横线处代码有错,请改正。
Dim word(3000)As String,pre(3000)As String
Const n=2000
Private Sub Form_Load ( )
'该过程的作用是从数据库读取 n 个单词,按字典顺序存储在数组 word 中,并在 Label1输出单词数量和容量
'代码略
End Sub
Private Sub Command1_Click ( )
Dim conp As Integer'存储压缩后的容量
Dim f As Boolean,m As Integer,k As Integer'k 存储公共前缀的长度
conp=0
For i=1To n
k=0
If i=1Then f=False Else f=True
'(1)
Do While k<m And f=True
If Mid(word(i),1,k+1)=Mid(word(i-1),1,k+1)Then
′(2)
Else
f=False
End If
Loop
pre(i)=CStr(k)+““+Mid(word(i),k+1,Len(word(i)))
'Cstr ( )函数能够将数字类型的值转换为字符类型的值,并却掉前导空格。
List2.AddItem pre(i)'(3)
Next i
Label2.Caption=“压缩后容量为“+Str(conp)+“字节“
End Sub发布:2024/6/27 10:35:59组卷:1引用:1难度:0.9 -
2.杨辉三角是二项式系数在三角形中的一种几何排列,如1图所示。从图可看出其显著特征是除斜边上的1外,其余数值均等于其肩部两数之和。
小明设计逐行打印杨辉三角的算法描述如下:
(1)确定折半边界值。当此行数据个数为奇数时,边界为与首末“等距离”的那个数:当此行数据个数为偶数时,边界为与首末“等距离”的那两个数中左侧数;
(2)计算杨辉值。数组顺序存储单行杨辉值,只计算边界以左的杨辉值,自边界处向左依次计算至第2列(1列直接置1)。
(3)输出杨辉值。正向输出数组中存储的杨辉值,再反向输出数组中所存值
(4)转到步骤1,继续以上步骤处理。
打印5行杨辉三角示意图如2图所示。
程序运行效果如3图所示,请回答下列问题:
(1)当文本框Text1中输入行数为8时,执行该程序后,a(2)的值为
(2)请在横线处填入合适的代码。发布:2024/4/20 14:35:0组卷:1引用:1难度:0.6 -
3.在一个数组中存储了若干个学生的技术成绩小题分,其中a(1)存储学生个数,从a(2)开始按顺序存储小题分数据。每个学生有33个小题的数据,例:a(2)-a(13)是“学生1”的信息客观题得分,a(27)-a(30)是“学生1”的信息主观题得分;a(14)-a(26)是“学生1”的通用客观题得分,a(31)-a(34)是“学生1”的通用主观题得分。
具体如表:题号 1-12 13-25 26-29 30-33 科目题型 信息客观题 通用客观题 信息主观题 通用主观题 满分分值 每题2 分 每题2分 4/8/7/7 6/9/3/6
算法的VB程序如下,回答下列问题。
(1)根据题目描述,使用如图所示数据,a(95)的数值是
(2)在程序横线处填上合适代码,使程序完整
Dim a(1 To 1000)As Integer,n As Integer
Private Sub Form_Load ( )
‘读入数据到数组a,数据个数n,代码略
End Sub
Private Sub Command1_Click ( )
Dim i As Integer,j As Integer
Dim fz(1 To 16)As Integer'fz数组存储信息各题满分值
Dim b(1 To 33)As Single'数组b存储全卷各题的平均得分
For i=1 To 16'数组fz存储信息16个小题的满分值
If i<=12 Then fz(i)=2
fz(13)=4:fz(14)=8:fz(15)=7:fz(16)=7
Next i
For i=2 To n'把数组a数据分别统计到各题中,计算各题总得分
①
b(j)=a(i)+b(j)
Next i
For i=1 To 33
If i<=12 Then
b(i)=b(i)/(a(1)*fz(i))’计算信息客观题各题的得分率
ElseIf i>=26 And i<=29 Then
b(i)=②
End If
Next i
For i=1 To 16
If i>12 Then j=i+13 Else j=i
b(j)=Int(b(j)*1000+0.5)/10'对结果四舍五入保留1位小数
List2.AddItem Str(i)+Str(b(j))+“%“
ave=③
Next i
Text1.Text=Str(ave/100)
End Sub发布:2024/4/20 14:35:0组卷:1引用:1难度:0.5