(郊游活动)有n名同学参加学校组织的郊游活动,已知学校提供给这n名同学的郊游总经费为cnt元,与此同时每位同学都自带了部分钱。为了方便郊游,活动地点提供m(n<=m<=100)辆自行车供人租用,租用每辆自行车也需要花费钱,每位同学可以使用自己携带的钱或者学校的郊游经费,为了方便账务管理,每位同学只能为自己租用自行车,且不会借钱给他人,他们想知道最多有多少位同学能够租用到自行车。
租车原则是首先考虑自带经费多的部分同学优先租相对花费少的自行车,尽量少花学校经费以达到最多同学租车的结果。比如学生带的钱为9,3,6,7,5,租车的钱分别需要15,8,12,6,9,11,如果5个人都能租车,至少需要学校提供经费为(6-3)+(8-5)+(9-6)+(11-7)+(12-9)=16,如果学校经费只有10元,则自带钱最少的同学不租车,这时所需学校经费为(6-5)+(8-6)+(9-7)+(11-9)=7。计算过程中采用二分查找法来判断租用自行车的人数能否达到最大值。
(1)
若7位同学自带经费分别为5,17,15,12,10,9,14,自行车租车费用分别为27,14,27,25,17,18,23,21,学校提供经费为25元,则最多有位同学能够租用到自行车。
(2)
VB程序代码如下,请在划线处填入合适的代码。
Dim a( 1 To 100) As
Integer, b(
1 To 100) As Integer
Dim n As Integer, m As
Integer
Private Sub Command1_Click()
Dim left As Integer, right As Integer, mid As
Integer, an s As Integer
n=Val(Text 1.Text) :m=Val(Text 2.Text)
‘从数据库读取n位同学带的钱存储在数组a,m辆自行车租用的钱存储在数组b,代码略。
Call px(a(),n)
Call px(b(),m)
left =1:right=n:ans= 0
Do While
left<=right
mid=(left+right) \ 2
If check(mid) =True Then
①
right =mid-1
Else
left =mid+ 1
End If
Loop
Label 1.Caption=“能租车的最大人数为”+Str(ans)
End Sub
Sub px(d() As Integer,
s As Integer)
Dimi as integer, j as integer, k as integer
For i=2Tos
k=d(i)
j=i-1
Do While k<d(j)
d(j+1)=d(j)
j=j-1
If j=0ThenExitDo
Loop
②
Next i
End Sub
Function check(mid As
Integer) As Boolean
Dim cnt As Integer, jf As Integer, t As
Integer
cnt=Val(Text 3.Text)
For t=1Ton-mid+ 1
If b(t) >a(mid+t-1) Then jf=b(t)
-a(mid+t-1) Else jf= 0
③
Next t
If cnt>= 0 Then check=True
End Function
① ② ③
答案: 【1】5
【1】ans = n - mid + 1【2】d(j + 1) = k【3】cnt = cnt – jf