10子序列1公开课.docx
子序列问题11 .求数组a中非降序数列的方法,算法描述如下:(1)用数组依次存储每个非降序数列中最大的元素(查找过程中的最大值),初始时b为数组a第1个 元素。加入方法:将a(i)与数组b中的每个元素依次逐个比较:若a(i)不比b(j)小就用a(i)替换b(j)中 的值;将a添加到第j个非降序数列中,并连接到c数组的c(j)中。若a都比b(j)小,则在数组b 最后添加新的元素值为a,即将a添加到第j+1个下降数列中,并连接到c数组的c(j+l)中。(3)若数组a各元素的值为:12, 36, 16, 36, 27,18时,则3个非降序数列分别:12, 36, 36, 16, 27,18。小明依据上述描述设计了如下VB程序。程序运行界面如下图所示:请回答下列问题:代码"Listl. Clear中的Clear是。(单选,填字母:A.对象名/B.事件名/C.属性名/D.方法名)实现上述功能的VB程序如下,请在画线处填合适的代码。(3)程序中加框处代码有错,请改正。Const m=15Dim a(l To m)As IntegerPrivate Sub Form_Load()读取m个数据,依次存储到a(l)、a、a(m)中,代码略End SubPrivate Sub Commandl Click()Dim b(l To m)As Integer '存储数列最大的值Dim c (1 To m)As String'存储非降序数列Dim i As Integer, j As IntegerDim bottom As IntegerDim bn As Integer'存储非降序数列的个数Listl. clearb(l)= a(l)c (1)= Str (a(l)For i = 2 To mFor j = 1 To bnIf Then b(j)=a(i) :c(j)= c(j)+ a(j) Exit ForEnd IfNext jIf j > bn Then bn = bn + :c(bn)= Str(a(i)施3,9,5,8,7, 2 12, IS, lb 1Z 6,13,153 9 9 12 15 155 8 11 12 1374 6 6秒列中却4个非降序效外HEnd IfNext iFor i = 1 To bnListl. Additem c (i)Next iText2. Text = 数列中共有"+ Str (bn) + 个非降序序列End Sub2 .求数组a中下降数列的方法,算法描述如下:(1)用数组b存储每个数列查找过程中的最小值,b(l)存储查找过程中第1个数列的最小值,b(2)存储 查找过程中第2个数列的最小值b(l)初值为数组a笫1个元素。(2)加入方法:将a (i)与数组b中的每个元素依次逐个比较:若a(i)比b(j)小就用a(i)替换b(j)中的值;将a (i)添加到第j个下降数列中,并存储在c数组的 c(j)中。若a(i)比b(j)都大,则在数组b最后新添加a(i)新的元素(新增加一个数列),同时数组c也新 添加一个元素。(3)若数组a各元素的值为:34, 54, 3, 76, 2, 3时,则3个下降数列分别为:“34, 3, 2”,“54, 3" “76”。 程序运行界面如下图所示:小明依据上述描述设计了如下VB程序,请回答下列问题:(1)若数组a的值是:“145, 34, 134, 12, 13”,数组b的值是。(2)请在划线处填入合适的代码。Const n=20Dim a(l To n) As IntegerPrivate Sub Form_Loacl ()读取n个数据:依次存储到a(l)、a、a(n)中,代码略End SubPrivate Sub Command1_C1ick 0Dim b(l To n) As Integer '存储当前过程中每个数列最小的值(每个数列最后一个元素)Dim c(l To n) As String '依次存储每个下降数列,如上图c(l)二“76 8 0”Dim i As Integer, j As IntegerDim bn As Integer'存储下降数列个数b(l) = a(l)c(l) = Str (a(l)For i = 2 To nFor j = 1 To bnIf Then b(j) = a(i)c(j) = c(j) + Str (a(i)Exit ForEnd IfNext jIf j > bn Thenbn = bn + 1c (bn) = Str (a(i)End IfNext iFor i = 1 To bnListl. Addltem c (i)Next iText2. Text ="数列中共有 + Str (bn) +”个下降序列End Sub3.小毅最近迷上一款导弹拦截的游戏。游戏中会依次出现n个导弹,游戏需要把这些导弹 都拦截下来,但小毅只有一种反导弹拦截系统车,该车有一个缺陷:它的第一发炮弹能拦截 任意高度的导弹,但后面每发射一次拦截炮弹,发射口的高度就会下降,也就是之后的每一 发炮弹都不能高于前一发的高度。小毅打算设计一个程序,可以根据游戏中出现的n个导弹, 快速计算出至少需耍几台这样的导弹拦截系统车,才能完美的把所有导弹拦截下来。算法说明:从a数组中读入一枚导弹的高度数据a(i),在b数组中查找第一个大于a(i) 数值的位置,并用a(i)代替。如果a(i)大于等于b数组中所有的数值,则增加一台导弹拦 截车(k=k+l)o请正在做卷子优秀的你回答下列问题。(1)若导弹高度依次为“243,309,123,167,229,183,87,333,92”,最少需要 台导弹拦截系统车才能拦截所有导弹。(2)请在划线处填入合适的代码。(3)程序中加框处代码有错,请改正。Dim a(0 To 100) As Integer'记录所有导弹的高度及顺序Dim b(0 To 100) As Integer' b (k)数组存储第k个系统车能拦截的最高高度Dim n As Integer Private Sub Cominandl_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 = 1 To n a(i)二 '随机产生高度75, 380的导弹,高度为整数Next i '将导弹高度依顺序显示在文本框Textl中,代码略 k = 1: b(k) = a(l) For i = 2 To n b(k + 1) = a(i) L = 1 R = k + 1 Do While L <= R m=(L + R+l)2 If b(m) < b(i) Then R = m - 1 res = m ElseL = m + 1 End If Loop _ If res = k + 1 Then k = k + 1 Next i Labe 12. Caption = "最少需要 + Str(k) + 台导弹拦截系统”End Sub4.VB程序,功能如下:单击“生成数组”按钮Commandl,则随机生成13个取值范围是113的正整数,分别存储到数组a中,对数组a的元素进行升序排列,并在标签labell中显示;再单 击“连续数”按钮Command2,则在排序后的数组a中查找连续个数最多(忽略重复数值)的一组 数值(即:连续数),若有两组连续数个数一样多,则取数值小的一组,将连续数显示在标签Iabel2中。运行界面如图所示。若实现上述功能的程序如下,请在划线处填写合适代码。Dim a(l To 13) As lnteger,n As IntegerPrivate Sub Commandl_Click()Dim i As Integer, s As String, j As Integer Randomizen = 13For i = 1 To na(i) = lnt(Rnd* 13) + 1Next iFor i = 1 To n - 1For j = i + 1 To nIf Then t=a(j):a(j)=a(i):a(i)=t Next jNext is =""For i = 1 To ns = s + Str(a(i)If Then s = s +Next iLabell. Caption = sEnd SubPrivate Sub Command2_Click()Dim i As Integer, j As Integer, t As Integer, k As IntegerDim max As Integer '存储连续数个数最大值 Dim begin As Integer '存储连续数开始的数值 k = 1: max = 1For i = 2 To 13If a(i) = a(i -1) + 1 Or a(i) = a(i -1) ThenIf Then k = k + 1If k > max Then max = k:begin = Elsek = 1End IfNext i s = For j = begin To begin + max - 1 s = s + Str(j)Next jLabel2. Caption = s End Sub连绚s- XL L 2. 4. 5. 7. 1. 8, % IL IL L2> 13生成掰月? 8 9