第十七届NOIP2011 提高组初赛试题及答案解析 下载本文

4 5 6 7 8 9 ?? 128 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 本题稍有些难度,观察m*n的0-1矩阵,可以看出m=2n,此矩阵其实就是所有7位的二进制数。每一列中有2n-1个1和个0,在一列里每个1都有2^(n-1)个0与它不同,同样每个0也有2^(n-1)个1与它不同,即每列的结果为22n-2*2=22n-1,n列的结果为n*22n-1,所以本题的结果为213*7.

此题也可以从递推的角度来求解:

f(n)=4n/(n-1)*f(n-1) (因为列增加1时行变为原来两倍,01的个数也对应为原来2倍)

f(1)=2

由此递推式子也可以得到通项公式:f(n)=n*22n-1。

再分析此题,发现就是从0开始由小到大每次增加1构造出所有n位二进制数,如果将低位写在右边更符合平常习惯,更易看出结果。 五、完成程序题 1.①ans.num[i+j-1]

②ans.num[i]:=ans.num[i] mod 10 ④ans.num[i] mod 2

③a.num[i]+b.num[i] ⑤inc(ans.len)

⑥a.len

⑧times(middle,middle),target

⑦ord(‘0’)或48

此题为简单高精度运算的大杂烩,加减乘除几乎全有。

乘法中要注意的是i位乘以j位的数据结果加到i+j-1位里,乘完以后再考虑进位;

加法是对应位相加,可以同步处理进位。

除法本题只是除以2,一位一位除2的时候,余数的情况要先处理。

另外还有一个比较两个以数组形式存储的大数据大小的子程序over,先从长度来考虑,谁长谁大,相等长度时从高位向低位依次比较,只要出现有大的情况就认为它大。 2.①inc(num)

②j:=i

④solve(j+1,right,deep+1)

③solve(left,j-1,deep+1) 基本算法是:

如果当前深度deep超过最大深度maxdeep,则maxdeep?deep且将叶子数sum记为1;

如要当前深度deep=maxdeep,则将sum数加1;

找到当前序列的最小值,并记录它的位置j,以它作为当前子树的根; 如果序列中位置j的前面还有数据(有左子树)则再以此方法处理左边的数据;

如果序列中位置j的后面还有数据(有右子树)则再以此方法处理右边的数据;