j := 1; //i, j 分别表示当前子序列的首尾,并保证其中至多有两个不同整数
while (j <= n) and (a[j] = a[i]) do
inc(j); cur1 := a[i];
cur2 := a[j]; count1 := (1) ; count2 := 1; ans_length := j - i + 1;
while j < n do begin
inc(j);
if a[j] = cur1 then
inc(count1)
else if a[j] = cur2 then
inc(count2) else begin
if a[j - 1] = (2) then
begin
while count2 > 0 do begin
if a[i] = cur1 then
dec(count1) else
dec(count2); inc(i);
end;
cur2 := a[j];
count2 := 1;
end
else begin
while count1 > 0 do begin
if a[i] = cur1 then
(3) else
(4) ; CCF NOIP2013 初赛提高组 Pascal 语言试题第 11 页,共 12 页
//(3 分)
//(3 分)
//(2 分) //(2 分)
inc(i);
end;
(5)
; //(3 分)
count1 := 1; end; end;
if (ans_length < j - i + 1) then begin
ans_length := j - i + 1;
ans_start := i;
ans_end := j;
end;
end;
for i := ans_start to ans_end do
write(a[i], ' ');
end.
CCF NOIP2013 初赛提高组 Pascal 语言试题
第 12 页,共 12 页
NOIP2013 初赛提高组(Pascal语言)试题参考解答
一、单项选择
1 A 2 A 3 B 4 D 5 A 6 B 7 D 8 B 9 D 10 11 12 13 14 15 D C B D B B 二、多项选择
1 AC 三、解答题
1. 0 1 1 1 2. 37/12 求解方法为:
2 AD 3 CD 4 AB 5 ABCD 先将问题转为青蛙随机跳了一步以后的情况,分为5种情况,分别是落在1号、2号、3号、4号、5号荷叶上,于是有 f5=(f1 + 1+f2+ 1+f3+ 1+f4 +1+f5) / 5 ,从而推得 f5=1+(f1+f2+f3+f4)/4。
推而广之,求fn的递推式为: f[1]=1
f[n]=1+(f[1]+f[2]+…+f[n-1])/(n-1) (n>1) 四、阅读程序题
(1)Yes 判定输入的字符串是否是回文串
(2)133 1到1000中是10或15的倍数的数的个数 (3)4 最长上升子序列的长度 (4)7 图中最长通路的长度 五、完成程序题
1.(1) n+i-p (2) i+1-p (3) a[i-p] (4) j<=end2 (5) i (6) J-1(或start2-1) 2、(1)j-1 (2) cur1 (3) dec(count1) (4) dec(count2) (5) cur1:=a[j]
CCF NOIP2013 初赛提高组 Pascal 语言试题
第 13 页,共 12 页