悬赏10分,C语言的高手吗?第十一届全国青少年信息学奥赛程序题第四题,有谁知道怎么做吗?

悬赏10分,C语言的高手吗?第十一届全国青少年信息学奥赛程序题第四题,有谁知道怎么做吗?,第1张

digit(n/10,m/10)

printf("%2ld",n%10)容易发生错误.

其实前面输出的6 2 5 4 3 7 9都是在digit(n/10,m/10)的内层循环中输出的。后面的9 7 3 4 5 2 6才是跳出内层循环digit(n/10,m/10)在语句printf("%2ld",n%10)中输出的,每次的内层循环digit(n/10,m/10)都有一个语句printf(n/10,m/10)

所以结果就是这样的了。这个问题其实不是很隐蔽

不过要是初学或不细心,哈哈,可就麻烦了!

一、基本知识单项选择题(每小题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)<>0

5 7 0

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

9 min <x

6 10 b2 = 0

11 x / y <>a1 / b2

12 EXIT DO

三、程序设计题(共20分)备注:解法不唯一,仅供参考

分析:

这里提供一种解法:

(1)先求出这n堆纸牌张数的平均值avg=(x1+x2+…+xn)/n;

(2)从左边开始向右边处理,即从第1堆开始考虑,依次往右,直至第n堆。具体分为三种情况:

①若x1>avg,则移动一次,移动牌数为x1-avg,把多出的牌加到上x2上,此后继续x2的讨论;

②若x1=avg,不用移动,直接转到x2的讨论;

③若x1<avg,此时向右边移动到xj的条件为:

x1+x2+…+xj-1 <avg * (j-1) 且x1+x2+…+xj ≥ j * avg

即前(j-1)堆纸牌加在一起的总数不足平均数,需要从右边的xj中补充一些

 若x1+x2+…+xj=avg*j,则移动j-1次,转入到xj+1的讨论;

 若x1+x2+…+xj>avg*j,则移动j次,并由xj移动到xj+1上的牌数为

x1+x2+…+xj - avg*j

源程序:

REM Test3

DIM x(1000)

INPUT "n=", n ' 输入总堆数

avg = 0

FOR i = 1 TO n ' 输入各堆牌的具体张数

INPUT x(i)

avg = avg + x(i)

NEXT i

avg = avg \ n

s = 0: j = 1

DO WHILE j <n

j1 = 1: s1 = x(j)

DO WHILE s1 <j1 * avg ' 从左往右找出需要移出纸牌的堆

j = j + 1

j1 = j1 + 1

s1 = s1 + x(j)

LOOP

IF s1 = j1 * avg THEN ' 前j1堆纸牌刚好可以平摊

s = s + j1 - 1

ELSE ' 前j1堆纸牌平摊后还有多余的纸牌

s = s + j1

x(j + 1) = x(j + 1) + s1 - j1 * avg' 多余纸牌移到第j+1堆

END IF

j = j + 1

LOOP ' j<n

PRINT "move="s

END

程序的运行结果为

测试数据一:

8 (共8堆牌)

6 10 9 12 8 11 7 9 (输入各堆的纸牌数)

move=5 (输出结果)

测试数据二:

4 (共4堆牌)

51 51 51 51 (输入各堆的纸牌数)

move=0 (输出结果)

CCF NOIP2010提高组(C++语言)参考答案与评分标准

一、单项选择题(共10题,每题1.5分,共计15分)

1 2 3 4 5 6 7 8 9 10

C A A D B D C B C B

二、不定项选择题(共10题,每题1.5分,共计15分,多选或少选均不得分)

1 2 3 4 5 6 7 8 9 10

ACD AD ABD AC B B D D BCD ABC

三、问题求解(共3题,每题5分,共计15分)

1.yyxy xx yyxy xyx xx xyx

2.12

3.18

四、阅读程序写结果(共4题,每题7分,共计28分)

1.16

2.1 2 3 5 6 7 9 10 14

3.4

4.1 6 9 5 4 8 3 2 7

五、完善程序(第1空2分,其余10空,每空2.5分,共计27分)

(说明:以下各程序填空可能还有一些等价的写法,各省可请本省专家审定和上机验证,不一定上报科学委员会审查)

1.① num <= 2(或num <3 或num == 2)

② go(LEFT_TO_RIGHT)

③ pos[i] == LEFT(或LEFT == pos[i])

④ hour[i] + go(RIGHT_TO_LEFT)(或go(RIGHT_TO_LEFT) + hour[i])

⑤ pos[i] = LEFT

本小题中,LEFT可用true代替,LEFT_TO_RIGHT可用true代替,RIGHT_TO_LEFT可用false代替。

2.① opt[k]

② home[r] = k

③ j = i + i(或j = 2 * i 或j = i * 2)

④ swap(i, j)(或swap(j, i))

⑤ value[i] + heap[1](或heap[1] + value[i])

⑥ i - m


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12067968.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存