题库 高中信息

题干

(加试题)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

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

同类题2

数组nam()、sex()、math()、su()分别存放学生的姓名、性别、数学和总分成绩,现要求编写一个程序使得数据按照男生“总分”的降序和女生“总分”的升序排列,其中男生在前女生在后,程序界面如下图所示:

实现该功能的VB程序如下,但加框处代码有错,请改正。

Dim nam(100) As String '存放学生姓名

Dim sex(100) As String '存放学生性别

Dim math(100) As Long '存放学生数学成绩

Dim su(100) As Long '存放学生总分成绩

Dim k As Integer 'k变量用来存学生人数

Private Sub Form_Load()

‘将数据库中的数据分别存储在相应的变量中并在列表框中显示出来

‘代码略

End Sub

Private Sub Command1_Click()

Dim mmax As Integer, gmax As Integer, flagm As Boolean, flagg As Boolean

i = 1: flagm = True: flagg = True

Do While i <= k And flagm = True ①   

    mmax = 0: gmax = 0

    flagm = False: flagg = False

  For j = i To k - i + 1

    If sex(j) = "男" And su(j) > su(mmax) Then mmax = j

    If sex(j) = "女" And su(j) > su(gmax) Then gmax = j

  Next j

   If mmax <> 0 Then

flagm = True

t = nam(mmax): nam(mmax) = nam(i): nam(i) = t

t = sex(mmax): sex(mmax) = sex(i): sex(i) = t

t = math(mmax): math(mmax) = math(i): math(i) = t

t = su(mmax): su(mmax) = su(i): su(i) = t

   End If

   If gmax <> 0 Then

flagg = True

If j = mmax Then    ②   

gmax = mmax

t = nam(gmax): nam(gmax) = nam(k - i + 1): nam(k - i + 1) = t

t = sex(gmax): sex(gmax) = sex(k - i + 1): sex(k - i + 1) = t

t = math(gmax): math(gmax) = math(i): math(i) = t

t = su(gmax): su(gmax) = su(k - i + 1): su(k - i + 1) = t

Else

t = nam(gmax): nam(gmax) = nam(k - i + 1): nam(k - i + 1) = t

t = sex(gmax): sex(gmax) = sex(k - i + 1): sex(k - i + 1) = t

t = math(gmax): math(gmax) = math(k - i + 1): math(k - i + 1) = t

t = su(gmax): su(gmax) = su(k - i + 1): su(k - i + 1) = t

End If

   End If

i = i + 1

Loop

For i = 1 To k

List2.AddItem nam(i) + "    " + sex(i) + "    " + Str(math(i)) + "    " + Str(su(i))

Next i

End Sub

程序中①处改为________________________________________。
程序中②处改为________________________________________。