1. 小毅最近迷上一款导弹拦截的游戏。游戏中会依次出现n个导弹,游戏需要把这些导弹都拦截下来,但小毅只有一种反导弹拦截系统车,该车有一个缺陷:它的第一发炮弹能拦截任意高度的导弹,但后面每发射一次拦截炮弹,发射口的高度就会下降,也就是之后的每一发炮弹都不能高于前一发的高度 。小毅打算设计一个程序,可以根据游戏中出现的n个导弹,快速计算出至少需要几台这样的导弹拦截系统车,才能完美的把所有导弹拦截下来。

算法说明:从a数组中读入一枚导弹的高度数据a(i),在b数组中查找第一个大于a(i)数值的位置,并用a(i)代替。如果a(i)大于等于b数组中所有的数值,则增加一台导弹拦截车(k=k+1)。

请正在做卷子优秀的你回答下列问题。

(1) 若导弹高度依次为“243,309,123,167,229,183,87,333,92”, 最少需要台导弹拦截系统车才能拦截所有导弹。
(2) 请在划线处填入合适的代码。

Dim a(0 To 100) As Integer   ‘记录所有导弹的高度及顺序

Dim b(0 To 100) As Integer    ‘b(k)数组存储第k个系统车能拦截的最高高度

Dim n As Integer

Private Sub Command1_ Click( )

    Dim L As Integer, R As Integer, m As Integer

    Dim k As Integer, res As Integer, i As Integer

    Randomize

    n=15

    For i= 1To n

        a(i)=       ‘随机产生高度[75,380]的导弹,高度为整数

    Next i

    ‘将导弹高度依顺序显示在文本框Text1中,代码略

    k=1:b(k)=a(1)

    For i=2 To n

        b(k+1)=a(i)

        L= 1

        R=k+1

        Do While L< = R

            m=(L+R+1)\2

            If  Then

                R=m-1

                res=m

           Else

                L=m+1

            End If

        Loop

        

        If res =k+1 Then k=k+1

    Next i

    Label2. Caption =“最少需要”+ Str(k) +“台导弹拦截系统”

End Sub

(3) 程序中加框处代码有错,请改正。
【考点】
查找算法及程序实现;
【答案】

您现在未登录,无法查看试题答案与解析。 登录
综合题 普通
能力提升
真题演练
换一批
2. 现有一个长为n,宽为1的水池,其截面如图a所示。水池截面可以看作是由行和列组成的矩阵,中间部分是由宽度为1且高低不一的墙分割的池底,左右两端黑色部分是无限高的墙,设最底端是水池的第一层,编号为1,依此向上编号。

往池中倒入一定的水量V (每1单位水量刚好填充一个格子, 格子大小为1×1),现要求倒入水后,每一列水位高度一致。

如图b所示,往池中倒入V=11的水量,则水位高度为3.5(解释:第一层没有空白单位,首先填满第2层的3个单位,然后填满第3层的5个单位,此时还剩氽11-3-5-3个单位的水量,第4层有6个单位的空白,不足以填满,此时3/6=0.5,故总填充高度为3+0.5=3.5)。

为了解决该问题,小吴设计了二分算法:通过枚举水位高度,计算所儒的水量与实际输入水量比较,如果所需水量大于实际水量(精确到0.01),则需降低水位高度,否则增加水位高度,直到得到正确结果。程序功能:运行程序时,在文本框Text1中输入倒入的水量V,在文本框Text2中输出能达到的水位高度(保留1位小数输出)。程序运行界面如图c所示。

(1) 假设池底如图a所示,若倒入的水量为4,则输出为 。
(2) 请在横线处填入合适的代码,以实现算法功能。

程序代码如下:

Dim V As Double

Dim a(1 To 100)As Integer, n As Integer

Private Sub Form_Load()     ‘初始化池底

  n=8

  a(1) = 2:a(2) = 1: a(3) = 4: a(4) = 2

  a(5)= 1:a(6) = 3: a(7) = 1: a(8) = 4

End Sub

Function check(g As Double) As Boolean

  Dim sum As Double    ‘变量sum用于计算水位高度为g时所儒水量

  Sum = 0

  For i = 1 To n

    If g > a(i) Then 【sum = sum + g】

  Next i

  If sum < V Then check = True Else check = False

End Function

Private Sub Command1_ Click()

  Dim L AS Double, R As Double, mid As Double

  L= 0:R = 32767

  V = Val(Text1.Text)

  Do While L + 0.001 < R

      mid=(L + R)/ 2

    If Then

      R= mid

    Else

      L =  

    End If

  Loop

  Text2.Text = “高度为:”+ Str(Int(R * 100 + 0.5) / 100)

End Sub

(3) 程序加框处代码有错误,请改正。
综合题 普通