小炫报名参加“智力大冲浪”节目。比赛规则如下:
比赛开始时参赛者将预先得到M元奖金。
比赛时间分为N个时间段(N≤100),有N个小游戏,每个时间段可完成1个游戏,第i个小游戏必须在规定期限t(i)时段前完成(1≤t(i)≤N),否则要从奖金M元中扣去奖金w(i),w(i)为自然数,不同的游戏扣去的奖金是不一样的。每个游戏必须从整时段开始。注意:比赛绝对不会让参赛者赔钱!
例如:当N=5,M=100时,
游戏编号
1
2
3
4
5
完成期限t(i)
1
4
2
3
2
扣除奖金数w(i)
5
4
10
8
7
在这种情况下,小炫依次完成编号为5、3、4、2、1的小游戏,获得了最高奖金95元。
他的算法思想:让扣款高的游戏尽量准时完成,扣除的奖金越少,则最后赢取的奖金越多。
1)按扣款数值从大到小排序,在样例中,排序后游戏编号依次为3、4、5、1、2;
2)对于游戏i,在时间段1到t(i)完成,效果都是一样的,所以尽量放置的时间段t(i)完成,若该时段已经被占用,则依次考察时间段t(i)-1,t(i)-2,……,1。在样例中,
①考虑游戏3,放置在时间段2完成(注:t(3)=2);
②考虑游戏4,放置在时间段3完成(注:t(4)=3);
③考虑游戏5,时间段2已被游戏3占用,放置在时间段1完成(注:t(5)-1=1);
④考虑游戏1,时间段1已被游戏5占用,不能按时完成,放到时间段5;
⑤考虑游戏2,放置在时间段4完成(注:t(2)=4)。
小炫按如上算法编写了一个VB程序,计算“智力大冲浪”游戏中玩家最多可赢取的奖金,将结果输出到文本框Text1中。
VB程序代码如下所示,请在划线处填入合适代码。
Dim n As Integer, m
As Integer
Dim t (1 To 100)As Integer '变量t(i)表示第i个游戏的完成期限
Dim w (1 To 100) As Integer '变量w(i)表示第i个游戏未完成要扣除的奖金
Dim f (1 To 100)As Boolean '变量f(i)表示第i个时段是否已经被占用
Private Sub Form_ Load()
'初始化游戏设置信息,时段数量n、初始奖金数m、数组t、数组w
'代码略
End Sub
Sub swap(x As Integer, y As Integer) '自定义过程,可以用Call语句来调用该过程
Dim z As
Integer
z=x:x=y:y=z
End Sub
Sub sort() '自定义过程,可以用Call语句来调用该过程
Dim x
As Integer, i As Integer, j As Integer
For i=1 To n-1
For
j=i+1 To n
If w(i)< w(j) Then
Call swap(w(i), w(j)) '调用自定义过程
End if
Next j
Next i
End Sub
Private Sub Command1_Click()
Dim i
As Integer, k As Integer, p As Integer
Call sort
'调用自定义过程
tot=0
For i=1 To n
f(i)= True
Next i
For i=1 To
n '对每个游戏从该游戏的规定期限开始往左找可用时间段
'找到则完成该游戏,否则放弃该游戏
p=-1
k=t(i)
Do
While k >0 And p=-1
If f(k)= True Then
p=k
f(k)= False
Else
End if
Loop
If
p=-1 Then tot=tot +w(i)
Next i
Text1.
text= str(ans)
End Sub
答案:【1】call swap(t(i),t(j))【2】k=k-1【3】ans=m- tot