1.某旅行團需在酒店預訂一批房間,要求所預訂的房間號碼盡量集中,如果有多種方案,優(yōu)先選擇預訂房間數(shù)目較少的方案,有多組可選方案時選擇起始房間號最小的方案。酒店有單人間和雙人間兩種房間,b數(shù)組按房間號順序存儲該房間可入住人數(shù),其中可入住人數(shù)為0時,表示該房間已有人入住,不可預訂。比如有16個房間可入住人數(shù)如下:
房號 |
i |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
人數(shù) |
b(i) |
2 |
0 |
2 |
2 |
0 |
1 |
2 |
1 |
2 |
1 |
0 |
2 |
1 |
0 |
2 |
2 |
下表給出了選擇預訂房間的過程(區(qū)間長度表示預訂房間的起始房號到最后一個房號包含的房間數(shù),區(qū)間長度值越小,代表預訂房間分布越集中),選擇最優(yōu)方案過程如(1)(2)(3)所示。
(1)從房間號碼分布區(qū)間長度值最小原則,選擇方案2、4、9。
(2)分布區(qū)間長度值相同時,選擇預訂房間數(shù)目最小的,因此選擇方案2、9。
(3)所有可選方案中,優(yōu)先選擇最先成立的(起始房號最小的)方案,最終選擇方案2。
方案 |
房號范圍 |
區(qū)間長度 |
房間數(shù)目 |
備注 |
方案 |
房號范圍 |
區(qū)間長度 |
房間數(shù)目 |
備注 |
方案1 |
1~6 |
6 |
4 |
|
方案6 |
8~13 |
6 |
5 |
|
方案2 |
3~7 |
5 |
4 |
|
方案7 |
9~15 |
7 |
4 |
人數(shù)>7,取消10號房 |
方案3 |
4~9 |
6 |
4 |
人數(shù)>7 取消6號單人間 |
方案8 |
10~16 |
7 |
4 |
人數(shù)>7,取消13號房 |
方案4 |
6~10 |
5 |
5 |
|
方案9 |
12~16 |
5 |
4 |
|
方案5 |
7~12 |
7 |
4 |
人數(shù)>7,取消8號單人間 |
|
|
|
|
|
程序運行界面如下,請完成相應的小題。
(1)如下圖所示16個房間,當入住人數(shù)為5人時,預訂房間號是:
。
(2)請在橫線處填寫適當?shù)拇a。
Const n=16'假設酒店總房間數(shù)為16
Dim b(1 To n) As Integer'b 數(shù)組按房間號順序存儲各房間可入住人數(shù)
Function find1(x,y) As Integer
'函數(shù) find1(x,y)的作用是從 b(x)到 b(y)中找到值為1的數(shù)組變量的下標,若找不到,返回值為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 變量存儲當前最優(yōu)方案中的預訂房間數(shù)目
Dim mindist As Integer'mindist 存儲當前的最小分布區(qū)間長度
'所有房間的可入住人數(shù)按房間號碼順序存儲到數(shù)組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'若可入住人數(shù)超出,在當前區(qū)間內(nèi)所選房間中取消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=“房間數(shù)量不足“
Else
List2.AddItem“預訂房間:“+Str(minnum)+“間“
For i=start To
If b(i)>0 And i<>pos Then
List2.AddItem“房間號:“+Str(i)+“,入住人數(shù):“+Str(b(i))
End If
Next i
End If
End Sub