给定m个区间和1个数组(有n个元素),现要求根据各区间限定的取值范围,将该数组依次分割成m+1个段,具体分割方法如下:
·第1段是从数组首个元素开始,元素值都属于第1区间的最长连续元素段。如果首个元素不属于第1区间,则第1段元素个数为0。
·第1段分割后的剩余元素,用同样的方法来依次分割第2段,第3段…,第m段。
·第m段分割后的剩余元素分割到第m+1段(剩余段)。
若第p(1≤p≤m-1)段末尾连续元素的值也同时属于第p+1区间,则这块连续元素称为第P段“重叠块”,该段其余部分称为第p段“非重叠块”。由于不存在第m+1区间,这里特别规定:第m段的全部元素都分制到第m段“非重叠块”,第m段“重叠块”的元素个数为0。一个数组分段示例如图所示。图中数组第1个元素10不属于第1区间[0,5],因此第1段的元素个数为0。10和20属于第2区间,而33不属于第2区间,因此第2段只包含10和20两个元素。第3段末尾连续三个元素的值也同时属于第4区间,因此,第3段“非重叠块”包含38,58,46,第3段“重叠块”包含5,62,69。
(1)
给定2个区间依次为[10,50]、[30,80],数组各元素为“12,44,34,45,66,50,45,70”,则第1段“重叠块”中的元素个数为个。
(2)
小李根据上述描述,设计了一个统计各段“非重叠块”“重叠块”和剩余段中元素个数的算法。算法的VB程序如下,请在画线处填入合适的代码。
Const
n=18,m=6
Dim
a(1 To n)As
Integer
Dim
b(1 To 2*m)As
Integer
b(1)、b(2)为第1区间的下限和上限,b(3)、b(4)为第2区间的下限和上限……
Dim
c(1 To 2*m+1)As
Integer
‘c(1)、c(2)分别存储第1段“非重叠块”和“重叠块”的元素个数;
‘c(3)、c(4)分别存储第2段“非重叠块”和“重叠块”的元素个数……
‘c(2*m-1)存储第m段“非重叠块”的元素个数,c(2m)存储第m段“重叠块”的元素个数(值为0);
‘c(2*m+1)存储剩余段的元素个数
Private
Sub Command1_Click( )
Dim i
As Integer,p As Integer,i As Integer,LL As Integer
‘读取n个数据并保存在数组a中,代码略
‘读取m个区间的下限和上限并保存在数组b中,代码略
For i=1
To 2*m+1
c(i)=0
Next i
i=1:p=1
L=0:LL=0
Do
While ①
If IsIn(i, p)Then
If IsIn(i, p+1)Then
LL=LL+1
Else
②
LL=0
End If
i=i+1
Else
c(2*p-1)=L
c(2*p)=LL
L=0:LL=0
p=p+1
End If
Loop
If
i<=n Then
c(2*p-1)=n-i+1
Else
c(2*p-1)=L
c(2*p)=LL
End If
‘输出统计结果,代码略
End
Sub
‘函数IsIn用来判断a(i)值是否属于第p区间
Function
IsIn(i As Integer, p As Integer)As Boolean
If
p>m Then
IsIn=False
Else
If ③ Then
IsIn=True Else IsIn =False
End
If
End
Function
以上程序段运行时,为了实现上述功能,画线处应填入的代码为:①;②;③。
答案: 【1】3
【1】i<=n And p<=m【2】L=L+LL+1【3】a(i)>=b(2*p-1)And a(i)<=b(2*p)