NOIP2012提高组初赛试题与答案
NOIP2012提高组day1
CCF全国信息学奥林匹克联赛(NOIP2012)复赛提高组 day1(请选手务必仔细阅读本页内容)注意事项:1、文件名(程序名和输入输出文件名)必须使用英文小写。
2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。
3、全国统一评测时采用的机器配置为:CPU Intel Core2 Quad Q8200 2.33GHz, 内存2G,上述时限以此配置为准。
4、特别提醒:评测在NOI Linux下进行。
1.Vigenère密码(vigenere.cpp/c/pas)【问题描述】16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码。
Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。
在密码学中,我们称需要加密的信息为明文,用M表示;称加密后的信息为密文,用C表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为k。
在Vigenère密码中,密钥k是一个字母串,k=k1k2…k n。
当明文M=m1m2…m n时,得到的密文C=c1c2…c n,其中c i=m i®k i,运算®的规则如下表所示:®【输入】输入文件名为vigenere.in。
输入共2行。
第一行为一个字符串,表示密钥k,长度不超过100,其中仅包含大小写字母。
第二行为一个字符串,表示经加密后的密文,长度不超过1000,其中仅包含大小写字母。
【输出】输出文件名为vigenere.out。
输出共1行,一个字符串,表示输入密钥和密文所对应的明文。
对于100%的数据,输入的密钥的长度不超过100,输入的密文的长度不超过1000,且都仅包含英文字母。
2.国王游戏(game.cpp/c/pas)【问题描述】恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏。
NOIP提高组初赛历年试题及答案求解题篇(完整资料).doc
【最新整理,下载后即可编辑】NOIP提高组初赛历年试题及答案求解题篇问题求解题(每次2题,每题5分,共计10分。
每题全部答对得5分,没有部分分)注:答案在文末提高组的问题求解题的知识点大多涉及计数问题、鸽巢原理、容斥问题、逻辑推理、递推问题、排列组合问题等。
NOIP2011-1.平面图可以画在平面上,且它的边仅在顶点上才能相交的简单无向图。
4个顶点的平面图至少有6条边,如图所示。
那么,5个顶点的平面图至多有_________条边。
NOIP2011-2.定义一种字符串操作,一次可以将其中一个元素移到任意位置。
举例说明,对于字符串“BCA”可以将A移到B 之前,变字符串“ABC”。
如果要将字符串“DACHEBGIF”变成“ABCDEFGHI”最少需要_________次操作。
NOIP2012-1. 本题中,我们约定布尔表达式只能包含p,q, r三个布尔变量,以及“与”(∧)、“或”(∨)、“非”(¬)三种布尔运算。
如果无论p, q,r如何取值,两个布尔表达式的值总是相同,则称它们等价。
例如,(p∨q)∨r和p∨(q∨r)等价,p∨¬p 和q∨¬q 也等价;而p∨q 和p∧q不等价。
那么,两两不等价的布尔表达式最多有_________个。
NOIP2012-2. 对于一棵二叉树,独立集是指两两互不相邻的节点构成的集合。
例如,图1有5个不同的独立集(1个双点集合、3个单点集合、1个空集),图2有14个不同的独立集。
那么,图3有_________个不同的独立集。
NOIP2013-1. 某系统自称使用了一种防窃听的方式验证用户密码。
密码是n个数s1,s2,…,sn,均为0或1。
该系统每次随机生成n个数a1,a2,…,an,均为0或1,请用户回答(s1a1+s2a2+…+snan)除以2的余数。
如果多次的回答总是正确,即认为掌握密码。
该系统认为,即使问答的过程被泄露,也无助于破解密码——因为用户并没有直接发送密码。
[NOIP2012提高组]国王游戏
[NOIP2012提⾼组]国王游戏题⽬:洛⾕P1080、Vijos P1779、codevs1198。
题⽬⼤意:国王和每个⼤⾂左、右⼿各写了⼀个数。
规定每个⼤⾂得到的⾦币数为他前⾯所有⼈左⼿的数字的乘积除以他⾃⼰右⼿的数(向下取整),现在国王要改变⼤⾂的排列顺序,使得获得奖赏最多的⼤⾂,所获奖赏尽可能的少(国王永远站在最前⾯)。
解题思路:(贪⼼)⾸先,交换相邻两个⼤⾂只会对这两个⼤⾂造成影响,并不会对其他⼤⾂造成影响。
我们考虑⼤⾂i和i+1,设他们左⼿数字分别为A[i]和A[i+1],右⼿分别为B[i]和B[i+1],前i-1个⼤⾂和国王左⼿的数的乘积为S,且A[i]B[i]<=A[i+1]B[i+1]。
原来两个⼤⾂能得到的⾦币数分别为S/B[i],S*A[i]/B[i+1]。
如果交换,则第⼀个⼤⾂现在能得到S*A[i+1]/B[i],第⼆个能得到S/B[i+1]。
由于A[i]B[i]<=A[i+1]B[i+1],所以S*A[i]*B[i]<=S*A[i+1]*B[i+1],所以S*A[i]/B[i+1]<=S*A[i+1]/B[i]。
由此可得⼤⾂以A[i]B[i]从⼩到⼤排序,答案越⼩。
⽽S*A[i+1]/B[i]>=S/B[i],S*A[i]/B[i+1]>=S/B[i+1],故最⼤的答案为后⾯那个⼤⾂的,也保证了答案的正确性。
然后⾼精度⼀下就好了。
C++ Code:#include<cstdio>#include<cstring>#include<iostream>#include<string>#include<vector>#include<algorithm>using namespace std;struct BigInteger {static const int BASE=100000000;static const int WIDTH=8;vector<long long>s;BigInteger(long long num=0){*this=num;}BigInteger operator = (long long num){s.clear();do{s.push_back(num%BASE);num/=BASE;} while(num>0);return *this;}BigInteger operator = (const string& str){s.clear();int x,len=(str.length()-1)/WIDTH+1;for(int i=0;i<len;i++){int end=str.length()-i*WIDTH;int start=max(0,end-WIDTH);sscanf(str.substr(start,end-start).c_str(),"%d",&x);s.push_back(x);}return *this;}BigInteger operator + (const BigInteger& b)const{BigInteger c;c.s.clear();for(int i=0,g=0;;i++){if(g==0&&i>=s.size()&&i>=b.s.size())break;int x=g;if(i<s.size())x+=s[i];if(i<b.s.size())x+=b.s[i];c.s.push_back(x%BASE);g=x/BASE;}return c;}bool operator < (const BigInteger& b)const{if(s.size()!=b.s.size())return s.size()<b.s.size();for(int i=s.size()-1;i>=0;i--)if(s[i]!=b.s[i])return s[i]<b.s[i];return false;}bool operator > (const BigInteger& b)const{return b<*this;}bool operator <= (const BigInteger& b)const{return !(b<*this);}bool operator >= (const BigInteger& b)const{return !(*this<b);}bool operator != (const BigInteger& b)const{return b<*this||*this<b;}bool operator == (const BigInteger& b)const{return !(b<*this)&&!(*this<b);}void cheng(int a){vector<long long>c;for(int i=0;i<s.size();++i){if(c.size()<=i)c.push_back(s[i]*a);elsec[i]+=s[i]*a;if(c[i]/BASE)if(c.size()<=i+1)c.push_back(c[i]/BASE);elsec[i+1]=c[i]/BASE;c[i]%=BASE;}s=c;}void chu(int a){vector<long long>c(s);if(s.back()/a)c[s.size()-1]=s.back()/a,s[s.size()-1]%=a;elsec.pop_back();for(int i=s.size()-2;i>=0;--i){long long num=s[i+1]*BASE+s[i];c[i]=num/a;num%=a;s[i]=num;}s=c;}};ostream& operator << (ostream &out,const BigInteger& x){out<<x.s.back();for(int i=x.s.size()-2;i>=0;i--){char buf[20];sprintf(buf,"%08d",x.s[i]);for(int j=0;j<strlen(buf);j++)out<<buf[j];}return out;}istream& operator >> (istream &in,BigInteger& x){string s;if(!(in>>s))return in;x=s;return in;}struct DC{int a,b;bool operator < (const DC&rhs)const{return a*b<rhs.a*rhs.b;} }p[1005];int n;BigInteger sum,Div,ans;int main(){ios::sync_with_stdio(false);cin>>n;for(int i=0;i<=n;++i)cin>>p[i].a>>p[i].b;sort(p+1,p+n+1);sum=ans=p[0].a;for(int i=1;i<=n;++i){Div=sum;Div.chu(p[i].b);if(ans<Div)ans=Div;sum.cheng(p[i].a);}cout<<ans<<endl;return 0;}。
NOIP2012信息学奥林匹克竞赛初赛-模拟卷
2012年全国青少年信息学奥林匹克联赛初赛模拟试题一.单项选择题(共10题,每题1.5分,共计15分,每题有且仅有一个正确答案。
)1、以下说法正确的是()A、第一个提出“goto语句有害论”的计算机科学家是Donald E.KnuthB、被誉为“迄今最伟大的计算机程序员、算法学家”的是Edsger Wybe DijkstraC、世界上第一位程序员是V on NoumaD、被誉为“计算机语言之母”的是Grace Hopper2、关于CPU的说法正确的是()A、计算机的运算速度取决于给定的时间内,它的处理器所能处理的数据量。
B、64位计算机指的是CPU每秒钟可处理的数据为2^64位。
C、双核CPU,是指在一个主板上放入两个CPU并行进行工作。
D、我国自主产权的CPU龙芯3A集成了两个处理器核心3、ASCII码表中的大写字母后有6个其它字符,接着便是小写字母。
现已知:A字母的ASCII码为(41)16{表示16进制数41 },那么f应为( )10A、46B、78C、102D、1084、Pascal的创始人是()。
(A)Donald E.Knuth (B)Steve Jobs (C)Charles Bachman D (D)Niklaus Wirth5、若二叉树的先序遍历序列为ABDECF,中序遍历序列DBEAFC,则其后序遍历序列为()A. DEBAFCB. DEFBCAC. DEBCFAD. DEBFCA6、已知后缀表达式abc+*d-,则它的中缀表达式和前缀表达式分别是:A) (a+b)*c-d -+*abcd B)a+b*c-d -+a*bcdC)a*(b+c)-d -*a+ bcd D)a*(b+c)-d -a b*+cd7、由权值为9,2,5,7的四个叶子结点构造一棵哈夫曼树,该树的带权路径长度为()A.23B.37C.44D.468、排序算法是稳定的意思是:关键码相同的记录排序前后相对位置不发生改变,下列哪种排序算法是不稳定的:A) 冒泡排序 B) 插入排序 C) 归并排序 D) 快速排序9、下图给出了一个加权有向图,从顶点V1出发,以下哪个是活动中的关键路径()A. V1,V5,V3,V2B. V1,V4,V3,V2C. V1,V4, V2D. V1,V4,V5,V3,V210、以下有关全国信息学奥林匹克竞赛说法有误的是()A、 NOI评测只检查按照要求输出的结果,而不涉及过程和算法。
2012noip提高组初赛试题
三、问题求解(共 2 题,每题 5 分,共计 10 分) 1. 2. 256 5536
四、阅读程序写结果(共 4 题,每题 8 分,其中第 3 题的 2 个小题各 4 分,共计 32 分) 1. 2. 3. 4. 41 16 (1)7 (2)2004 55 (4 分) (4 分)
五、完善程序(第 1 题第 2 空 3 分,其余每空 2.5 分,共计 28 分)以下各程序填空可能还有一些等价的 写法,各省赛区可请本省专家审定和上机验证,可以不上报 CCF NOI 科学委员会检查。 Pascal 语言 1 ① ② ③ ④ ⑤ 2 ① ② ③ ④ ⑤ ⑥ next := (k mod c) + 1 s[n] := q[tail] q[head] q[head] q[tail] next(head) false used[data[i]] := false used[data[i]] = false j n break return (k % c) + 1 s[n] = q[tail] C++语言 C 语言 0 used[data[i]] = 0
其中,Pascal 语言和 C++语言中的 false 可以用 0 代替;第 2 题第 1 空中的圆括号可以省略。
第十八届全国青少年信息学奥林匹克联赛初赛 提高组参考答案
一、单项选择题(共 10 题,每题 1.5 分,共计 15 分) 1 A 2 B 3 B 4 A 5 D 6 A 7 A 8 D 9 A 10 B
二ቤተ መጻሕፍቲ ባይዱ不定项选择题(共 10 题,每题 1.5 分,共计 15 分,多选或少选均不得分) 1 A 6 CD 2 AD 7 AB 3 AD 8 A 4 BD 9 CD 5 ABC 10 BD
NOIP提高组初赛历年试题及答案完善题篇
for (i = m; i>= 1; i--){
used[data[i]] = false;
for (j =data[i]+1; j <= n; j++) if (!used[j]){
used[j] =true;
data[i] = j;
flag = true;
break;
}
if (flag)
{
for (k = i+1;k <= m; k++)
solve(left, j –1, deep + 1);
if(j<right)
solve(j+ 1, right, deep + 1);
}
int main()
{
inti;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
maxDeep=0;
solve(1,n,1);
cout<<maxDeep<<' '<<num<<endl;
}
void push()
for (j = 1; j<=n; j++) if (!used[j]){
data[k] = j;
used[j] =true;
break;
}
break;
}
}
}
}
NOIP2012-2.新壳栈 小 Z 设计了一种新的数据结构“新壳栈”。首先,它和传统的栈一样支持压入、弹 出操作。此外,其栈顶的前 c 个元素是它的壳,支持翻转操作。其中,c> 2 是 一个固定的正整数,表示壳的厚度。小 Z 还希望,每次操作,无论是压入、弹 出还是翻转,都仅用与 c 无关的常数时间完成。聪明的你能帮助她编程实现“新 壳栈”吗? 程序期望的实现效果如以下两表所示。其中,输入的第一行是正整数 c,之后每 行输入都是一条指令。另外,如遇弹出操作时栈为空,或翻转操作时栈中元素不 足 c 个,应当输出相应的错误信息。
NOIP2012初赛第3题解析
NOIP2012初赛试题解析(第3题问题求解)上传:朱全民浏览:144 时间:10-15/news/view/id/2931. 本题中,我们约定布尔表达式只能包含p,q,r三个布尔变量,以及“与“(^)、”或“(v)、”非“(~)三种布尔运算。
如果无论p,q,r如何取值,两个布尔表达式的值总是相同,则称它们等价。
例如,(pVq)Vr和pV(qVr)等价,pV~p和~qVq也等价,而pVq和p^q不等价。
那么,两两不等价的布尔表达式最多有_______个。
解答:对于p、q、r三个变量,每个变量可取0,1两种取值,共有8种组合。
对于每种组合,代入表达式只有0和1两种答案。
因此两两不等价的表达式只有2^8=256种。
2. 对于一棵二叉树,独立集是指两两互不相邻的节点构成的集合。
例如图1有5个不同的独立集(1个双点集合,3个单点集合,1个空集),图2有14个不同的独立集,那么,图3有_____________个不同的独立集。
解答:设m(i)为以i个为根结点的树的独立集总个数f(i)为选i的总个数g(i)表示不选i的总个数,显然有m(i)=f(i)+g(i)对于二叉树,如果根节点选,则儿子节点不能选,有f(i)=g(left_child[i])*g(right_child[i])如果根节点不选,则解与根节点无关,直接为左右儿子的解相乘,有g(i)=m(left_child[i])*m(right_child[i])具体用动态规划求解如下(计算的时候是从下往上算,这里设树的节点总数为根节点编号),显然该题就是求m(17),m(17)=f(17)+g(17)=1936+3600=5536f(17)=g(8)*g(8)=44*44=1936g(17)=m(8)*m(8)=60*60=3600m(8) =f(8)+g(8)=16+44=60f(8)=g(1)*g(6)=1*16=16g(8)=m(1)*m(6)=2*22=44m(6)=f(6)+g(6)=6+16=22f(6)=g(1)*g(4)=1*6=6g(6)=m(1)*m(4)=2*8=16m(4)=f(4)+g(4)=2+6=8f(4)=g(1)*g(2)=1*2=2g(4)=m(1)*m(2)=2*3=6m(2)=f(2)+g(2)=3f(2)=g(1)=1g(2)=m(1)=2m(1)=2f(1)=1g(1)=1长沙市雅礼中学朱全民2012年10月15日。
初赛模拟试题(二)[1]
NOIP2012初赛模拟试题(二)(普及 Pascal语言二小时完成)●●全部试题答案均要求写在答卷纸上,写在试卷纸上一律无效●●一.单项选择题(共10题,每题1.5分,共计15分。
每题有且仅有一个正确答案。
)1、下列说法正确的是( )。
A. CPU的主频越高,其运算速度越快B.存储器具有记忆能力,其中信息任何时候都不会丢失C.两个显示器屏幕尺寸相同,则它们的分辨率必定相同D.计算机系统可以分为硬件系统和系统软件两大部分2、有一个数值2341,它与十六进制数4E1相等,那么该数值是( )。
A.五进制数B.六进制数C.七进制数D.八进制数3、在计算递归函数时,如不使用递归过程,则一般情况下必须借助于( )数据结构。
A.栈B.树C.双向队列D.广义表4、表达式a*(c-b)/(d+e)的前缀表达式是()。
A.acbde*-/+ B.*-/+achde C.-cb*a/+de D./*a-cb+de5、在一个具有N个顶点的无向图中,要连通全部的顶点至多需要边的数目是( )。
A.N B.N-l C.N*(N-1)/2 D.N*(N-1)6. 二进制数00100100和00010100的和是( )。
A.00101000 B.001010100 C.01000100 D.001110007、一个队列开始为空,数列1,2,3……按顺序进队,经过操作序列“进、进、出、进、进、出、进、进、进、出、进、出”后,队列中的倒数第2个元素是()A.5 B.6 C.7 D.88、表达式28 div 4 mod (-3)+trunc(3.675)的值是( )。
A.5 B.4 C.3 D.29、在一棵度为3的树中,度为3的结点个数为2,度为2的结点个数为1,则度为0的结点个数为( )。
A.4 B.5 C.6 D.710、存储400个24*24点阵汉字的字模所需的存储容量为( )。
A.255KB B.75KB C.37.5KB D.28.125KB11、存储一幅分辨率为1024*768像素的256色图片需要的存储容量为( )。
2012十八届noip提高组题目及答案-推荐下载
p,q,r 如何取值,两个布尔表达式的值总是相同,则称它们等价。例如(p∨q)∨r 和 p∨(q∨r)等价,p∨¬p 和 q∨¬q 也等价;而 p∨q 和 p∧q
不等价。那么两两不等价的布尔表达式最多有
个。
2. 对于一棵二叉树,独立集是指两两互不相邻的节点构成的集合。例如,图 1 有 5 个不同的独立集(1 个双点集合,3 个单点集合、1 个空集),
C. 国际会议中,每个人都与他国地位对等的人直接进行会谈
D. 体育比赛中,每一级比赛的优胜者晋级上一级比赛
5.如里不在快速排序中引入随机化,有可能导致的后果是( )。
A.数组访问越界
B.陷入死循环
C.排序结果错误
D.排序时间退化为平方级
6.1946 年诞生于美国宾夕法尼亚大学的 ENIAC 属于( )计算机。
readln(n); ans := 0; for i:=1 to n do
if gcd(n,i)=i then ans := ans + 1;
writeln(ans); end. 输入:120 输出:_____________ 3. var
图 2 有 14 个不同的独立集。那么图 3 有
个不同的独立集。
三、阅读程序写结果。(共 4 题,每题 8 分,共计 32 分)
1. var n,i,temp,sum:integer; a :array[1..100] of integer;
begin readln(n); for i:=1 to n do read(a[i]); for i:=1 to n-1 do if a[i]>a[i+1] then begin temp := a[i]; a[i] := a[i+1]; a[i+1] := temp; end; for i:=n downto 2 do if a[i]<a[i-1] then begin temp := a[i]; a[i] := a[i-1]; a[i-1] := temp; end; sum := 0; for i:=2 to n-1 do inc(sum,a[i]); writeln(sum div (n-2));
(word完整版)NOIP提高组初赛历年试题及答案阅读题篇,.docx
NOIP 提高组初赛历年试题及答案阅读题篇程序写果(共 4 ,每 8 分,共 32 分)程序的最好方法并非是依次从到尾。
程序不像迷,我无法从末尾几找到答案,也不像一本引人入的籍,只需直接翻到褶最多的那几,我就能找到最精彩的片断。
因此我在程序,最好逐一考察研究每一段代,搞清楚每一段代的来去脉,理解每一段代在程序中所起的作用,而形成一个虚的程序构,并以此基来行。
1、分:高入手,逐深入,正确理解程序。
2、写注解:固化、、提已有的理解成果。
3、先模:根据代序跟踪量,模运算。
4、找律:先模几次循后,找出背后的律。
5、看功能:从代构和运算果判断程序功能。
6、猜算法:有不知道算法,通构和函数猜一猜。
7、方法:了解程序本后,一个熟悉的方法。
大多数人来,写程序是令人开心的一件事情,人的程序却很痛苦,很恐惧,宁愿自己重写一遍。
其到好的程序,就像一篇美文,令人心神怡,豁然开朗,因背后是一个人的思,甚至整个人生。
人的程序不可以巩固自己的知,启自己的思,提升自己的修养,你收,其,也是在学、在、在工作中的最重要、最常用的基本功。
如果写程序是把自己的思化代,程序就是把代化你理解的人的思。
当你程序有烈的代入感,像演一,真正入到的精神世界,面部表情也随之日丰富起来。
祝你!你通关了!之,看得多,得多,拼得多,你就考得多⋯⋯NOIP2011-1 .#include <iostream>#include <cstring>using namespace std;const int SIZE = 100;int main(){int n,i,sum,x,a[SIZE];cin>>n;memset(a,0,sizeof(a));for(i=1;i<=n;i++){cin>>x;a[x]++;}i=0;sum=0;while(sum<(n/2+1)){i++;sum+=a[i];}cout<<i<<endl;return 0;}输入:114 5 6 6 4 3 3 2 3 2 1一步步模拟,注意输出的是sum超出循环条件时的i 值(中位数),而不是sum ,也不是a[x]输出: 3NOIP2011-2 .#include <iostream> using namespace std; int n;void f2(int x,int y); void f1(int x,int y){if(x<n)f2(y,x+y);}void f2(int x,int y){cout<<x<<' ';f1(y,x+y);}int main(){cin>>n;f1(0,1);return 0;}输入: 30此为简单的递归题,依次输出f2(x,y)中的x值,注意边界条件时f1(x,y)的x>=30咦!这不是隔一个输出一个的Fibonacci吗?输出: 1 2 5 13 34NOIP2011-3 .#include <iostream>using namespace std; const int V=100;int n,m,ans,e[V][V];bool visited[V];void dfs(int x,intlen){int i;visited[x]= true;if(len>ans)ans=len;for(i=1;i<=n;i++)if( (!visited[i]) &&(e[x][i]!=-1) ) dfs(i,len+e[x][i]);visited[x]=false;}int main(){int i,j,a,b,c;cin>>n>>m;for(i=1;i<=n;i++)for(j=1;j<=m;j++)e[i][j]=-1;for(i=1;i<=m;i++){cin>>a>>b>>c;e[a][b]=c;e[b][a]=c;}for(i=1;i<=n;i++)visited[i]=false;ans=0;for(i=1;i<=n;i++)dfs(i,0);cout<<ans<<endl;return 0;}输入:4 61 2 102 3 203 4 304 1 401 3 502 4 60一看就知这是深搜算法(DFS ),输入是个四个顶点的无向图(邻接矩阵如下):如len>ans,则 ans=len,可以说明这是个在图中用DFS找最长的路径的程序。
noip2012初赛练习
初赛练习选择题1、一个向量第一个元素的存储地址是100,每个元素的长度是2,则第5个元素的地址是( B ) A)110 B) 108 C) 100 D) 1092、设有一个含有13个元素的Hash表(O~12),Hash函数是:H(key)=key % 13,其中%是求余数运算。
用线性探查法解决冲突,则对于序列(2、8、31、20、19、18、53、27),18应放在第几号格中( B ) 。
B)A) 5 B) 9 C) 4 D) 03、按照二叉数的定义,具有3个结点的二叉树有( C )种。
A)3 B)4 C)5 D)64、在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的( B )倍。
A)1/2 B)1 C)2 D)45、设栈S和队列Q初始状态为空,元素e 1 ,e 2 ,e 3 ,e 4 ,e 5 ,e 6依次通过栈S,一个元素出栈后即进入队列Q,若出队的顺序为e 2 ,e 4 ,e 3 ,e 6 ,e 5 ,e 1 ,则栈S的容量至少应该为( B )。
B)A)2 B)3 C)4 D)56、知一个栈的入栈顺序是1,2,3,…,n,其输出序列为P1,P2,P3,…,Pn,若P1是n,则Pi是( C )。
C)A)i B)n-1 C)n-i+1 D)不确定7、二叉树的高度为h,所有结点的度为0或2,则此树最少有( B )个结点。
A)2h-1 B)2h-1 C)2h+1 D)h+18、(0.5)10=( C )16。
A)0.1 B) 0.75 C) 0.8 D) 0.259、已知x =(0.1011010)2 ,则[ x / 2 ]补 =( C )2 。
A)0.1011101 B)11110110 C)0.0101101 D)0.10011010、与二进制数101.01011等值的十六进制数为( D )。
A)A.B B)5.51 C)A.51 D)5.5811、微型计算机的问世是由于( C ) 的出现。
2012年信息学奥赛NOIP普及组初赛试题及参考答案
一、选择题
6. 如果一棵二叉树的中序遍历是 BAC,那么它的先序遍历不可能是( )。 A. ABC B. CBA C. ACB D. BAC
│7
一、选择题
7. 目前个人电脑的( )市场占有率最靠前的厂商包括 Intel、AMD 等公司。 A. 显示器 B. CPU C. 内存 D. 鼠标
│8
普及组2012年初赛
一、选择题 二、问题解答 三、程序阅读 四、程序完善
│1
一、选择题
1. 计算机如果缺少( ),将无法正常启动。 A. 内存 B. 鼠标 C. U 盘 D. 摄像头
│2
一、选择题
2. ( )是一种先进先出的线性表。 A. 栈 B. 队列 C. 哈希表(散列表) D. 二叉树
│3
│ 25
二、问题解答
1. 如果平面上任取 n 个整点(横纵坐标都是整数),其中 一定存在两个点,它们连线的中点也是整点,那么n 至少是 ______5____。
│ 26
二、问题解答
⒉在 NOI 期间,主办单位为了欢迎来自各国的选手,举行 了盛大的晚宴。在第十八桌,有 5 名大陆选手和 5 名港澳选手共同进膳。为了增进交流,他们决定相隔就坐, 即每个大陆选手左右旁都是港澳选手,每个港澳选 手左右旁都是大陆选手。那么,这一桌一共有_______种不同 的就坐方案。
│ 22
一、选择题
18. 在程序运行过程中,如果递归调用的层数过多,会因为( )引发错误。 A.系统分配的栈空间溢出 B.系统分配的堆空间溢出 C.系统分配的队列空间溢出 D.系统分配的链表空间溢出
│ 23
一、选择题
19. 原字符串中任意一段连续的字符所组成的新字符串称为子串。则字符“AAABBBCCC”共
(word完整版)NOIP提高组初赛历年试题及答案阅读题篇,.docx
(word完整版)NOIP提高组初赛历年试题及答案阅读题篇,.docxNOIP 提高组初赛历年试题及答案阅读题篇程序写果(共 4 ,每 8 分,共 32 分)程序的最好方法并非是依次从到尾。
程序不像迷,我无法从末尾几找到答案,也不像一本引人入的籍,只需直接翻到褶最多的那几,我就能找到最精彩的片断。
因此我在程序,最好逐一考察研究每一段代,搞清楚每一段代的来去脉,理解每一段代在程序中所起的作用,而形成一个虚的程序构,并以此基来行。
1、分:高入手,逐深入,正确理解程序。
2、写注解:固化、、提已有的理解成果。
3、先模:根据代序跟踪量,模运算。
4、找律:先模几次循后,找出背后的律。
5、看功能:从代构和运算果判断程序功能。
6、猜算法:有不知道算法,通构和函数猜一猜。
7、方法:了解程序本后,一个熟悉的方法。
大多数人来,写程序是令人开心的一件事情,人的程序却很痛苦,很恐惧,宁愿自己重写一遍。
其到好的程序,就像一篇美文,令人心神怡,豁然开朗,因背后是一个人的思,甚至整个人生。
人的程序不可以巩固自己的知,启自己的思,提升自己的修养,你收,其,也是在学、在、在工作中的最重要、最常用的基本功。
如果写程序是把自己的思化代,程序就是把代化你理解的人的思。
当你程序有烈的代入感,像演一,真正入到的精神世界,面部表情也随之日丰富起来。
祝你!你通关了!之,看得多,得多,拼得多,你就考得多??NOIP2011-1 .#include#includeusing namespace std;const int SIZE = 100;int main(){int n,i,sum,x,a[SIZE];cin>>n;memset(a,0,sizeof(a));for(i=1;i<=n;i++){cin>>x;a[x]++;}i=0;sum=0;while(sum<(n/2+1)){i++;sum+=a[i];}cout<<i<<endl;< p="">return 0;}输入:114 5 6 6 4 3 3 2 3 2 1一步步模拟,注意输出的是sum超出循环条件时的i 值(中位数),而不是sum ,也不是a[x]输出: 3NOIP2011-2 .#include using namespace std; int n;void f2(int x,int y); void f1(int x,int y){if(x<n)< p="">f2(y,x+y);}void f2(int x,int y){cout<<x<<' ';<="" p="">f1(y,x+y);}int main(){cin>>n;f1(0,1);return 0;}输入: 30此为简单的递归题,依次输出f2(x,y)中的x值,注意边界条件时f1(x,y)的x>=30咦!这不是隔一个输出一个的Fibonacci吗?输出: 1 2 5 13 34 NOIP2011-3 .#includeusing namespace std; const int V=100;int n,m,ans,e[V][V];bool visited[V];void dfs(int x,intlen){int i;visited[x]= true;if(len>ans)ans=len;for(i=1;i<=n;i++)if( (!visited[i]) &&(e[x][i]!=-1) ) dfs(i,len+e[x][i]); visited[x]=false;}int main(){int i,j,a,b,c;cin>>n>>m;for(i=1;i<=n;i++)for(j=1;j<=m;j++)e[i][j]=-1;for(i=1;i<=m;i++){cin>>a>>b>>c;e[a][b]=c;e[b][a]=c;}for(i=1;i<=n;i++)visited[i]=false;ans=0;for(i=1;i<=n;i++)dfs(i,0);cout<<ans<<endl;< p="">return 0;}输入:4 61 2 102 3 203 4 304 1 401 3 502 4 60一看就知这是深搜算法(DFS ),输入是个四个顶点的无向图(邻接矩阵如下):如len>ans,则ans=len,可以说明这是个在图中用DFS找最长的路径的程序。
NOIP提高组初赛历年试题及答案阅读题篇
NOIP提高组初赛历年试题及答案阅读题篇阅读程序写结果(共4 题,每题8 分,共计32 分)阅读程序的最好方法并非是依次从头到尾。
程序不像迷语,我们无法从末尾几页找到答案,也不像一本引人入胜的书籍,只需直接翻到褶皱最多的那几页,我们就能找到最精彩的片断。
因此我们在阅读程序时,最好逐一考察研究每一段代码,搞清楚每一段代码的来龙去脉,理解每一段代码在程序中所起的作用,进而形成一个虚拟的程序结构,并以此为基础来进行阅读。
1、分层读:高层入手,逐层深入,正确理解程序。
2、写注解:固化、总结、提炼已有的理解成果。
3、先模拟:根据代码顺序跟踪变量,模拟运算。
4、找规律:先模拟几次循环后,找出背后的规律。
5、看功能:从代码结构和运算结果判断程序功能。
6、猜算法:有时不知道算法,通过结构和函数猜一猜。
7、换方法:了解程序本质后,换一个熟悉的方法试试。
对大多数人来说,写程序是令人开心的一件事情,读别人的程序却很痛苦,很恐惧,宁愿自己重写一遍。
其实读到好的程序,就像读一篇美文,令人心旷神怡,豁然开朗,因为这背后是一个人的思维,甚至整个人生。
阅读别人的程序不仅可以巩固自己的知识,启发自己的思维,提升自己的修养,让你收获满满,其实,这也是在学习、在竞赛、在工作中的最重要、最常用的基本功。
如果说写程序是把自己的思维转化为代码,读程序就是把代码转化为你理解的别人的思维。
当你阅读程序时有强烈的代入感,像演员一样,真正进入到编剧的精神世界,面部表情也随之日渐丰富起来。
祝贺你!你通关了!总之,看得多,码得多,拼得多,你就考得多……NOIP2011-1.#include <iostream>#include <cstring> using namespace std; const int SIZE = 100; int main(){int n,i,sum,x,a[SIZE]; cin>>n;memset(a,0,sizeof(a)); for(i=1;i<=n;i++){ cin>>x;a[x]++;}i=0;sum=0;while(sum<(n/2+1)){ i++;sum+=a[i];}cout<<i<<endl; return 0;}输入:4 5 6 6 4 3 3 2 3 2 1一步步模拟,注意输出的是sum超出循环条件时的i值(中位数),而不是sum,也不是a[x]输出:3NOIP2011-2.#include <iostream>using namespace std;int n;void f2(int x,int y);void f1(int x,int y){if(x<n)f2(y,x+y);void f2(int x,int y){cout<<x<<' ';f1(y,x+y);}int main(){cin>>n;f1(0,1);return 0;}输入:30此为简单的递归题,依次输出f2(x,y)中的x值,注意边界条件时f1(x,y)的x>=30咦!这不是隔一个输出一个的Fibonacci吗?输出:1 2 5 13 34NOIP2011-3.#include <iostream>using namespace std;const int V=100;int n,m,ans,e[V][V];bool visited[V];void dfs(int x,intlen){int i;visited[x]= true;if(len>ans)ans=len;for(i=1;i<=n;i++)if( (!visited[i]) &&(e[x][i]!=-1) ) dfs(i,len+e[x][i]);visited[x]=false;}int main(){int i,j,a,b,c;cin>>n>>m;for(i=1;i<=n;i++)for(j=1;j<=m;j++)e[i][j]=-1;for(i=1;i<=m;i++) {cin>>a>>b>>c; e[a][b]=c;e[b][a]=c;}for(i=1;i<=n;i++) visited[i]=false; ans=0;for(i=1;i<=n;i++) dfs(i,0);cout<<ans<<endl; return 0;}输入:4 61 2 102 3 203 4 304 1 401 3 502 4 60一看就知这是深搜算法(DFS),输入是个四个顶点的无向图(邻接矩阵如下):如len>ans,则ans=len,可以说明这是个在图中用DFS找最长的路径的程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
s3[tmpLen+1] = '\0'; if (right[x] >= 0) check(right[x]); } void dfs(int x, int th) { if (th == n) {
s3[0] = '\0'; check(0); if (strcmp(s2, s3) == 0) {
文件交互的一种软件。
A. 资源管理器
B. 浏览器
C. 电子邮件
D. 编译器
3. 目前个人电脑的( )市场占有率最靠前的厂商包括 Intel、AMD 等公司。
A. 显示器
B. CPU
C. 内存
D. 鼠标
4. 无论是 TCP/IP 模型还是 OSI 模型,都可以视为网络的分层模型,每个网络协议都会被
归入某一层中。如果用现实生活中的例子来比喻这些“层”,以下最恰当的是( )。
ans = 0; calc(0, 1); printf("%d\n", ans); } return; } if (left[x] == -1 && right[x] == -1) { left[x] = th; father[th] = x; dfs(th, th+1); father[th] = -1; left[x] = -1; } if (right[x] == -1) { right[x] = th; father[th] = x; dfs(th, th+1); father[th] = -1; right[x] = -1; } if (father[x] >= 0) dfs(father[x], th); } int main() {
1. #include <stdio.h>
int n, i, temp, sum, a[100];
int main() {
scanf("%d", &n); for (i = 1; i <= n; i++)
scanf("%d", &a[i]); for (i = 1; i <= n - 1; i++)
CCF NOIP2012 初赛 提高组 C 6
int n, i, ans;
int gcd(int a, int b) {
if (a % b == 0) return b;
else return gcd(b, a%b);
} int main() {
scanf("%d", &n); ans = 0; for (i = 1; i <= n; i++)
h++; data[h] = 1; while (h > 1 && data[h] == data[h-1])
merge(); } printf("%d\n", ans); }
(1) 输入:8 输出:_________(4 分) (2) 输入:2012 输出:_________(4 分)
4. #include <stdio.h> #include <string.h>
A. 128KB
B. 1MB
C. 1GB
D. 4GB
9. 以下不属于目前 3G(第三代移动通信技术)标准的是( )。
A. GSM
B. TD-SCDMA
C. CDMA2000
D. WCDMA
10. 仿生学的问世开辟了独特的科学技术发展道路。人们研究生物体的结构、功能和工作原
理,并将这些原理移植于新兴的工程技术之中。以下关于仿生学的叙述,错误的是( )。
7. 逻辑异或(⊕)是一种二元运算,其真值表如下所示。
a
b
a⊕b
False False True True
False True False True
False True True False
以下关于逻辑异或的性质,正确的有( )。
A. 交换律:a ⊕ b = b ⊕ a
CCF NOIP2012 初赛 提高组 C 4
B. 结合律:(a ⊕ b) ⊕ c = a ⊕ (b ⊕ c) C. 关于逻辑与的分配律:a ⊕ (b ∧ c) = (a ⊕ b) ∧ (a ⊕ c) D. 关于逻辑或的分配律:a ⊕ (b ∨ c) = (a ⊕ b) ∨ (a ⊕ c)
8. 十进制下的无限循环小数(不包括循环节内的数字均为 0 或均为 9 的平凡情况),在二 进制下有可能是( )。
A. 中国公司的经理与斯里兰卡公司的经理交互商业文件
第4层
中国公司经理
斯里兰卡公司经理
↑↓
↑↓
第3层
中国公司经理秘书
斯里兰卡公司经理秘书
↑↓
↑↓
第2层
中国公司翻译
斯里兰卡公司翻译
↑↓
↑↓
第1层
中国邮递员
←→
斯里兰卡邮递员
CCF NOIP2012 初赛 提高组 C 1
B. 军队发布命令 第4层
司令
↓
A. 电子管
B. 晶体管
C. 集成电路
D. 超大规模集成电路
7. 在程序运行过程中,如果递归调用的层数过多,会因为( )引发错误。
A. 系统分配的栈空间溢出
B. 系统分配的堆空间溢出
CCF NOIP2012 初赛 提高组 C 2
C. 系统分配的队列空间溢出
D. 系统分配的链表空间溢出
8. 地址总线的位数决定了 CPU 可直接寻址的内存空间大小,例如地址总线为 16 位,其最 大的可寻址空间为 64KB。如果地址总线是 32 位,则理论上最大可寻址的内存空间为 ( )。
第1层
英国驻瑞典大使
←→
瑞典驻英国大使
D. 体育比赛中,每一级比赛的优胜者晋级上一级比赛
第4层
奥运会
↑
第3层
全运会
↑
第2层
省运会
↑
第1层
市运会
5. 如果不在快速排序中引入随机化,有可能导致的后果是( )。
A. 数组访问越界
B. 陷入死循环
C. 排序结果错误
D. 排序时间退化为平方级
6. 1946 年诞生于美国宾夕法尼亚大学的 ENIAC 属于( )计算机。
第十八届全国青少年信息学奥林匹克联赛初赛
提高组 C 语言试题 竞赛时间:2012 年 10 月 13 日 14:30~16:30
选手注意:
试题纸共有 15 页,答题纸共有 2 页,满分 100 分。请在答题纸上作答,写在试题纸上 的一律无效。
不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。
A. 无限循环小数(不包括循环节内的数字均为 0 或均为 1 的平凡情况)
B. 无限不循环小数
C. 有限小数
D. 整数
9. 以下( )属于互联网上的 E-mail 服务协议。
A. HTTP
B. FTP
C. POP3
D. SMTP
10. 以下关于计算复杂度的说法中,正确的有( )。 A. 如果一个问题不存在多项式时间的算法,那它一定是 NP 类问题 B. 如果一个问题不存在多项式时间的算法,那它一定不是 P 类问题 C. 如果一个问题不存在多项式空间的算法,那它一定是 NP 类问题 D. 如果一个问题不存在多项式空间的算法,那它一定不是 P 类问题
data[h-1] = data[h-1] + data[h]; h--; ans++; } int main() { scanf("%d", &n);
CCF NOIP2012 初赛 提高组 C 7
h = 1; data[h] = 1; ans = 0; for (i = 2; i <= n; i++) {
int left[20], right[20], father[20]; char s1[20], s2[20], s3[20]; int n, ans, tmpLen;
void calc(int x, int dep) {
ans = ans + dep*(s1[x] - 'A' + 1); if (left[x] >= 0) calc(left[x], dep+1); if (right[x] >= 0) calc(right[x], dep+1); } void check(int x) { if (left[x] >= 0) check(left[x]); tmpLen = strlen(s3); s3[tmpLen] = s1[x];
} sum = 0; for (i = 2; i <= n - 1; i++)
sum += a[i]; printf("%d\n", sum / (n - 2)); return 0; }
输入: 8 40 70 50 70 20 40 10 30 输出:_________
2. #include <stdio.h>
2. 对于一棵二叉树,独立集是指两两互不相邻的节点构成的集合。例如,图 1 有 5 个不同 的独立集(1 个双点集合、3 个单点集合、1 个空集),图 2 有 14 个不同的独立集。那 么,图 3 有_________个不同的独立集。
图1
图2
CCF NOIP2012 初赛 提高组 C 5
图3
四、阅读程序写结果(共 4 题,每题 8 分,其中第 3 题的 2 个小题各 4 分,共 计 32 分)
if (a[i] > a[i + 1]) { temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp;