少儿信息学奥赛试题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
翻看小木块时,可以从两端进行。例如,设中间状态如下:
此时,可以从两个方向看,即从a或b处开始: (1)若看a则有三种可能性:为红色,则不用交换;为兰色, 交换一次,即a与b交换;为黄色,交换两次,即c与b交换一 次,然后a与c再交换一次。此时,平均交换次数为1。 (2)若看b,也有三种可能性:为兰色,则不用交换;为红 色,交换一次,即b与a交换。为黄色,交换一次,即b与c交 换。此时,平均交换次数为2/3。 由此可见,从b处翻看直到游戏结束,次数最少符合题目 要求。
分析1:用f(n)表示自然数n所能扩展的数据总个数,则f(1)=1,f(2)=2, f(3)=2,f(4)=4,f(5)=4,f(6)=6,f(7)=6,f(8)=10,f(9)=10。
可得递推公式:f(n)=1+ f(1)+ f(2)+…+ f(n div 2)。
var s:array[1..1000] of longint; i,j,n:integer; begin readln(n); for i:=1 to n do s[i]:=1;{设初始值为1,其本身算一种} for i:=2 to n do for j:=1 to i div 2 do s[i]:=s[i]+s[j]; {i左边分别加上1至i div 2 按规则扩展出的自然数} writeln(s[n]); end.
积木游戏
问题描述: 设有n 个小木块排成一排,如图 。游戏开始时,每个小木块向 下的一面涂有红、黄、蓝三种颜色之中的一种(约定:0表示红色,1表示黄色, 2表示兰色)。要求通过翻看与交换方式对小木块重新排列(翻看的规则为每 个小木块只能看一次,可以从左向右翻或从右向左翻),最终成为下面的形状:
即相同颜色的木块排列在一起,从左到右按红、蓝、黄的顺序排列。请设 计一个翻看与交换的方案,使得用最少的交换次数实现上面的要求。 输入文件2.in: 共二行,第一行只有一个整数n (1≤n≤100),表示小木块的数目。第二行 共有N个数据,表示这些小木块的颜色,各数之间用空格间隔。 输出文件2.out: 一行,一个整数,表示最少的交换次数。 样例 输入:7 0112021 输出:4
果园大丰收
问题描述: 红领巾果园丰收了n堆果子,明明决定把它们合成一堆。他每一次可 选两堆合并,消耗的体力为两堆果子数之和。这样经过n-1次合并,就合 成一堆了。他总共消耗的体力等于他每次合并时消耗的体力之和。明明 想尽量节省体力。请你计算出他将最少总共消耗多少体力。 输入文件包括两行: 第一行:整数n (1≤n≤50),表示果子的堆数。 第二行:n个整数,以空格相隔,其中第i个整数Ai(1≤Ai≤100)表示第i 堆的果子数。 输出文件,只有一个整数,表示明明最少总共消耗的体力值。 样例: 输入:3 5 3 12 输出:28
分析2:用f(n)表示自然数n所能扩展的数据总个数,则f(1)=1, f(2)=2,f(3)=2,f(4)=4,f(5)=4,f(6)=6,f(7)=6,f(8)=10,f(9)=10。 可得递推公式如下: ⑴当i为奇数时,f(i)=f(i-1) ⑵当i为偶数时,f(i)=f(i-1)+f(i/2)
Var n,y,r,t,xq,i,j:integer;{n:年,y:月,r:日期,t:天数,xq:星期几,i:年数} s:array[1..7] of longint; begin readln(i); i:=1900+i;{得到结束年份} n:=1900;{开始于1900年} xq:=0; repeat for y:=1 to 12 do begin case y of 1,3,5,7,8,10,12:t:=31; 4,6,9,11:t:=30; 2:if (n mod 400=0) or(n mod 100<>0) and (n mod 4=0) then t:=29 else t:=28 end;{判断每个月的天数} for r:=1 to t do begin xq:=xq+1; if xq=8 then xq:=1;{从1到7变化,到8则令其为1} if r=13 then s[xq]:=s[xq]+1;{日期为13时,对应的星期几次数增加1} end;{每次循环时间过去一天} end;{每次循环时间过去一个月} n:=n+1;{年份增加1} until i=n; for j:=1 to 6 do write(s[j],' ');write(s[7]); end.
var f:array[0..1000] of longint; i,j,n:integer; begin readln(n); f[1]:=1; for i:=2 to n do begin f[i]:=f[i-1]; if i mod 2=0 then f[i]:=f[i-1]+f[i div 2]; end; writeln(f[n]); end.
var n,i,tem,r,b,y,t:integer; a:array[1..100] of 0..2; begin readln(n); for i:=1 to n do read(a[i]); r:=1; b:=n; y:=n; t:=0; while b>=r do if a[b]=0 then begin tem:=a[r]; a[r]:=a[b]; a[b]:=tem; if b<>r then t:=t+1; r:=r+1; {红色增加1个} end else if a[b]=1 then begin tem:=a[b];a[b]:=a[y];a[y]:=tem; if b<>y then t:=t+1; b:=b-1; y:=y-1;{黄色增加1个} end else b:=b-1;{兰色增加1个} write(t); end.
var i,j,k,l,n,t:integer; s:array[1..50] of longint; sum:longint; begin sum:=0; readln(n); for i:=1 to n do read(s[i]); for i:=1 to n-1 do for j:=i+1 to n do if s[i]>s[j] then begin t:=s[i];s[i]:=s[j];s[j]:=t; end;{对输入的果子堆进行从少到多排序} for i:=1 to n-1 do begin s[i+1]:=s[i]+s[i+1];{将前两堆,即最少的两堆合并} sum:=sum+s[i+1];{累记消耗的体力数} if s[i+1]>s[i+2] then{从i+1到n堆重新排序} begin for j:=i+1 to n-1 do for k:=j+1 to n do if s[j]>s[k] then begin t:=s[j];s[j]:=s[k];s[k]:=t; end; end; end; writeln(sum); end.
数的计数 问题描述: 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n≤1000), 然后对此自然数按照如下 方法进行处理。 1.不作任何处理; 2.在它的左边加上一个自然数,但该自然数不能超过原数 的一半; 3.加上数后,继续按此规则进行处理,直到不能再加自然 数为止。 样例: 输入: 6 满足条件的数为 6 (此部分不必输出) 16 26 126 36 136 输出: 6
13号星期几
编程统计:从1900年来自百度文库月1日(星期一)开始经过的n年 当中,每个月的13号这一天是星期一、星期二、星期 三、……、星期日的次数分别是多少? 输入文件:一行,一个整数n (1≤n≤400)
输出文件:一行 7个整数, 以空格相隔,(依次是星期 一、星期二、星期三、……、星期日的次数)
样例 输入:1 输出:1 3 1 2 2 2 1