1、慈溪市小学生计算机程序设计竞赛复赛试题解题报告2013年慈溪市小学生计算机程序设计比赛复赛试题解题报告1 统计方格(count.pas) 【问题描述】 给出一张n行m列仅由黑白方格组成的黑白图片(行从上到下1到n编号,列从左到右1到m编号)。如下图是一张由17行18列方格构成的黑白图片,图片中的任意一个方格要么是白色,要么是黑色。仔细观察这张黑白图片我们可以发现,图中共有60个黑色方格(连续的黑色方格不能算成一个),黑色方格最多的行是第3行和第17行,都为6个,黑色方格最少的行是第5行、第6行、第9行、第12行、第13行、第15行,都为2个。 请编写程序统计黑白图片中黑色方格的总数,黑色方格数
2、目最多的行的行号及黑色方格数目最少的行的行号。 【输入数据】 输入文件count.in:输入从文件中读取,输入共n+1行。 第1行是两个整数n和m(1n, m100),分别表示黑白图片的行数和列数,两个整数间用空格分隔。 第2行到第n+1行,描述了图片中每个方格的颜色,黑色用整数0表示,白色用整数1表示。每行为m个用空格分隔的0或1,其中第i+1行第j 列的整数为Aij(1in,1jm,Aij=0或者Aij=1),表示图片第i 行第j 列位置的方格颜色。 【输出数据】 输出文件count.out:结果输出到文件中。 输出共1行,包含3个整数。分别表示输入文件所表示的黑白图片中黑色方格的总数,黑
3、色方格数目最多的行的行号及黑色方格数目最少的行的行号。注意,如果黑色方格最多的行有多行一样,则输出行号最小的,同样,如果黑色方格最少的行有多行一样,也是输出行号最小的。【输入输出样例1】count.in6 61 1 1 1 1 11 0 1 0 0 11 0 1 1 0 11 0 1 0 1 11 0 1 0 0 11 1 1 1 1 1count.out10 2 1【样例1解释】 输入的黑白图片的大小为6行6列,第1行0个黑色方格,第2行3个黑色方格,第3行2个黑色方格,第4行2个黑色方格,第5行3个黑色方格,第6行0个黑色方格。所以总共有10个黑色方格,黑色方格最多且行号最小的行是第2行,
4、黑色方格最少且行号最小的行是第1行。【输入输出样例2】count.in17 181 1 1 1 1 1 0 0 1 1 0 0 1 1 1 1 1 11 1 1 1 1 0 1 1 0 0 1 1 0 1 1 1 1 11 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 11 1 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 11 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 11 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 11 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1 11 0 0 1 1 1 1 1
5、 1 1 1 1 1 1 1 0 0 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 00 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 00 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 01 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 11 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 11 1 0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 11 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 11 1 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1
6、1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1count.out60 3 5【样例2解释】样例2如题目描述。【数据范围约定】 所有的输入数据保证1n, m100。【问题分析】给出一张黑白图片,输出黑色方格的总数,黑色方格数目最多的行的行号及黑色方格数目最少的行的行号。具体见【问题描述】。【算法分析】直接模拟,枚举每一行。【参考程序】var n,m,max,min,v1,v2,i,j,x,s,tot:longint;beginassign(input,count.in); reset(input);assign(output,count.out); rewrite(out
7、put);max:=-1; min:=101;read(n,m);for i:=1 to n do begin s:=0; for j:=1 to m do begin read(x); if x=0 then begin inc(s); inc(tot); end; end; if smax then begin max:=s; v1:=i; end; if smin then begin min:=s; v2:=i; end; end;writeln(tot, ,v1, ,v2);close(input); close(output);end.2转圈游戏(circle.pas) 【问题描述
8、】 n个小朋友(小朋友从0到n-1进行编号)围坐一圈玩游戏。按照顺时针方向依次给 n 个位置编号,也是从0到n-1。最初,第0号小朋友在第0号位置,第1号小朋友在第1号位置,依此类推。游戏规则如下:每一轮给出两个整数a、b。若a的值等于1,则所有小朋友依次逆时针转b个位置;若a的值等于2,则所有小朋友依次顺时针转b个位置。比如:a=2,b=3,那么第0号位置上的小朋友顺时针转到第3号位置,第1号位置上的小朋友顺时针转到第4号位置,第n-3号位置上的小朋友顺时针转到第0号位置,第n-2号位置上的小朋友顺时针转到第1号位置,第n-1号位置上的小朋友顺时针转到第2号位置,一轮转圈结束。依照上面的游戏
9、规则,请问进行q轮后,第0到n-1号位置上的小朋友的编号分别是什么?【输入数据】 输入文件circle.in:输入从文件中读取,输入共q+1行。第1行是两个整数n和q(1n100000, 0q200000),表示n个小朋友要进行q轮转圈游戏,两个整数间用空格分隔。 第2行到第q+1行,每行两个用空格分隔的整数。其中第i+1行两个整数为ai 和bi (ai=1或者ai=2, 0bin-1),表示第i 轮转圈的信息。若ai=1,则所有小朋友依次向逆时针方向转bi 个位置,若ai=2,则所有小朋友依次向顺时针方向转bi 个位置。【输出数据】 输出文件circle.out:结果输出到文件中。输出共n行
10、,每行包含一个整数,第i 行整数表示经过转圈后第i-1号位置上的小朋友的编号。【输入输出样例1】circle.in4 12 3circle.out1230【样例1解释】4个小朋友参加转圈游戏,转圈共进行了1轮,在这轮转圈游戏中,所有小朋友依次向顺时针方向转了3个位置,第0号小朋友转到第3号位置,第1号小朋友转到了第0号位置,第2号小朋友转到了第1号位置,第3号小朋友转到了第2号位置,所以最后第0号位置到第3号位置上的小朋友编号分别是1,2,3,0。【输入输出样例2】circle.in5 31 12 21 3circle.out23401【样例2解释】 5个小朋友参加转圈游戏,转圈共进行了3轮。
11、在第1轮转圈游戏中,所有小朋友依次向逆时针方向转了1个位置。在第2轮转圈游戏中,所有小朋友依次向顺时针方向转了2个位置。在第3轮转圈游戏中,所有小朋友依次向逆时针方向转了3个位置。所以最后第0号位置到第4号位置上的小朋友编号分别是2,3,4,0,1。【数据范围约定】 对于70%的数据,1n1000,0q2000。对于100%的数据,1n100000,0q200000。【问题分析】求n个人按输入规则进行q轮转圈后,每个位置上的人对应的编号。【算法分析】模拟,只要统计出每个人最后相当于逆时针转了多少距离即可。【参考程序】var x,i,v,n,m,a,b:longint;beginassign(i
12、nput,circle.in); reset(input);assign(output,circle.out); rewrite(output);read(n,m);for i:=1 to m do begin read(a,b); if a=1 then v:=(v-b) mod n else v:=(v+b) mod n; end;for i:=0 to n-1 do begin x:=(i-v) mod n; while xmid) or (ai=mid) and (bim) do inc(i); while (ajm) do dec(j); if Ij;if lj then sort(l,j);if i ans then ans:=abs(s1-s2); for j:=q+1 to m do begin if odd(j) then s1:=s1+ai+p-1,j-ai-1,j else s2:=s2+ai+p-1,j-ai-1,j; if odd(j-q) then s1:=s1-ai+p-1,j-q+ai-1,j-q else s2:=s2-ai+p-1,j-q+ai-1,j-q; if abs(s1-s2) ans then ans:=abs(s1-s2) end end; writeln(ans); close(input); close(output)end.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1