第十四届全国青少年信息技术奥林匹克联赛初赛问题解答

一、选择题基础知识(每小题2分,***20分)

1 B 2 B 3 C 4 A 5 C

6 D 7 A 8 B 9 D 10 B

二、阅读程序中的填空(每空5分,***60分)注:有其他正确答案也可以打分。

标题号为空

1 1 87 68 43 25

2 2 5 0 4 3 2 1

3 3 b - a

4 s = 400

4 5 a(k * i ) = 0

6 a(i) = 1或a(i)

5 7 0

8 393-a * 81-b * 41-c * 29

9分钟& ltx

6 10 b2 = 0

11x/y & lt;& gta1 / b2

12出口DO

三。编程题(***20分)备注:解法不唯一,仅供参考。

分析:

这里有一个解决方案:

(1)首先求n叠牌数的平均值,avg =(x 1+x2+…+xn)/n;

(2)从左向右开始,即从1桩开始,然后右转,直到第N桩。具体分为三种情况:

①如果x 1 & gt;Avg,移动一次,移动的卡数是x1-avg,把多余的卡加到上面的x2上,然后继续x2的讨论;

②如果x1=avg,不动直接进入x2的讨论;

③如果X1

x 1+x2+…+XJ-1 & lt;Avg * (j-1)和x1+x2+…+xj ≥ j * avg。

即第(j-1)堆牌加起来的总数小于平均值,需要从右边的xj开始补。

如果x1+x2+…+xj=avg*j,移动j-1次,转到xj+1的讨论;

如果x 1+x2+…+XJ & gt;Avg*j,然后移动j次,从xj移动到xj+1的卡数为

x1+x2+…+xj - avg*j

源程序:

快速眼动测试3

尺寸x(1000)

输入" n= ",n '输入堆的总数。

平均值= 0

对于i = 1到n '输入每堆牌的具体数量。

输入x(i)

平均值=平均值+ x(i)

接下来我

avg = avg \ n

s = 0: j = 1

一边做一边j & ltn

j1 = 1: s1 = x(j)

DO WHILE s 1 & lt;J1 * avg '从左到右找出要移除的牌堆。

j = j + 1

j1 = j1 + 1

s1 = s1 + x(j)

如果s1 = j1 * avg那么‘j 1之前的那堆牌正好可以平分。

s = s + j1 - 1

否则j1中的那堆牌摊平后还有多余的牌。

s = s + j1

X(j+1)= X(J+1)+s 1-J 1 * AVG '多余的牌移到J+1的那一堆。

如果…就会结束

j = j + 1

LOOP ' j & ltn

PRINT " move =s

结束

程序的运行结果是

测试数据1:

8 (***8叠牌)

6 10 9 12 8 1179(输入每堆牌的数量)

移动=5(输出结果)

测试数据2:

4 (***4叠牌)

51 51 51 51(输入每堆牌的数量)

移动=0(输出结果)