题库 高中信息

题干

(加试题)n堆金币,把两堆金币合并到一起,n堆金币经过n-1次合并之后就只剩下一堆了。如何消耗最少的体力,把这n堆金币合并成一堆?合并所消耗的体力等于每次合并两堆金币的重量之和。比如,n=3时表示共有3堆金币,每堆重量分别是2、1、9.一种合并方案是2和9合并,新堆重量是11,消耗体力为11;接着11和1合并,新堆重量是12,消耗体力为12,因此总消耗体力是11+12=23。另一种方案是:1和2合并,新堆重量是3,消耗体力为3;接着3和9合并,新堆重量是12,消耗体力为12,因此总消耗体力是3+12=15。可以证明这就是最少消耗体力。
 
小张经分析,每次n堆金币如果都是从小到大,将前两堆合并成新一堆,然后,继续进行从小到大排序,如此合并成最后一堆,此时消耗体力最少,为此他编写了一个解决上述问题,求最少体力的VB程序,功能如下:窗体加载时,自动读取n堆金币的数据,依次存储在数组元素a(1)、a(2)、a(3)…中,金币堆数存储在变量n中,n堆金币的重量数据显示在列表框List1中。单击“求解”按钮Command1,程序对n堆金币进行合并处理,消耗最少的体力显示在文本框Text1中。程序运行界面如图所示。
(1)如果有5堆金币,每堆重量分别是12、8、5、9、15,则将这5堆金币合并成一堆金币,最少消耗体力是__________。
(2)实现上述功能的VB程序如下,请在划线处填入合适的代码。
Const n = 10
Dim i As Integer, j As Integer, t As Integer
Dim a(1 To n) As Integer
Private Sub Form_Load()

'本过程用于读取n堆的数据并存储在数据a中

'代码略

End Sub
'sort(x)过程的功能是对a(x)、a(x+1)、……、a(n)中的数进行从小到大排序
Private Sub sort(x As Integer)

For i =__________To n - 1

For j = n To i + 1 Step -1

If a(j) < a(j - 1) Then

t = a(j): a(j) = a(j - 1): a(j - 1) = t

End If

Next j

Next i

End Sub
Private Sub Command1_Click()
Dim sum As Integer, k As Integer

sum = 0

sort (1)

For k = 1 To n - 1

a(k + 1) = a(k) + a(k + 1)

sum = sum +  ___________ 

sort (______)

Next k

Text1.Text = Str(sum)

End Sub
上一题 下一题 0.99难度 填空题 更新时间:2019-05-07 06:15:54

答案(点此获取答案解析)