ImageVerifierCode 换一换
格式:DOC , 页数:48 ,大小:323.62KB ,
资源ID:7960821      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/7960821.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(NOIP提高组初赛历年试题及答案阅读题篇.doc)为本站上传会员【pc****0】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

NOIP提高组初赛历年试题及答案阅读题篇.doc

1、NOIP提高组初赛历年试题及答案阅读题篇 阅读程序写结果(共4 题,每题8 分,共计32 分) 阅读程序的最好方法并非是依次从头到尾。程序不像迷语,我们无法从末尾几页找到答案,也不像一本引人入胜的书籍,只需直接翻到褶皱最多的那几页,我们就能找到最精彩的片断。因此我们在阅读程序时,最好逐一考察研究每一段代码,搞清楚每一段代码的来龙去脉,理解每一段代码在程序中所起的作用,进而形成一个虚拟的程序结构,并以此为基础来进行阅读。 1、分层读:高层入手,逐层深入,正确理解程序。 2、写注解:固化、总结、提炼已有的理解成果。 3、先模拟:根据代码顺序跟踪变量,模拟运算。 4、找规律:先模拟几次循

2、环后,找出背后的规律。 5、看功能:从代码结构和运算结果判断程序功能。 6、猜算法:有时不知道算法,通过结构和函数猜一猜。 7、换方法:了解程序本质后,换一个熟悉的方法试试。 对大多数人来说,写程序是令人开心的一件事情,读别人的程序却很痛苦,很恐惧,宁愿自己重写一遍。其实读到好的程序,就像读一篇美文,令人心旷神怡,豁然开朗,因为这背后是一个人的思维,甚至整个人生。 阅读别人的程序不仅可以巩固自己的知识,启发自己的思维,提升自己的修养,让你收获满满,其实,这也是在学习、在竞赛、在工作中的最重要、最常用的基本功。 如果说写程序是把自己的思维转化为代码,读程序就是把代码转化为你理解的别人

3、的思维。当你阅读程序时有强烈的代入感,像演员一样,真正进入到编剧的精神世界,面部表情也随之日渐丰富起来。祝贺你!你通关了! 总之,看得多,码得多,拼得多,你就考得多…… NOIP2011-1. #include #include 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]++; }

4、 i=0; sum=0; while(sum<(n/2+1)){ i++; sum+=a[i]; } cout< using namespace std; int n; void f2(int x,int y); void f1(int x,int y) { if(x

5、x+y); } void f2(int x,int y) { cout<>n; f1(0,1); return 0; } 输入:30 此为简单的递归题,依次输出f2(x,y)中的x值,注意边界条件时f1(x,y)的x>=30 咦!这不是隔一个输出一个的Fibonacci吗? 输出:1 2 5 13 34 NOIP2011-3. #include using namespace std; const int V=100; int n,m,ans,e

6、[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

7、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,则ans=len,可以说明这是个在图中用DFS

8、找最长的路径的程序。DFS以任意点作为起点,找一条路径,本次走过的点不走,找到没路走为止。由于就4个点,最多就走3条边,看看最长的那3条,结果如下图: 输出:150 NOIP2011-4. #include #include #include using namespace std; const int SIZE=10000; const int LENGTH=10; int n,m,a[SIZE][LENGTH]; int h(int u,int v) { int ans,i; ans=0; fo

9、r(i=1;i<=n;i++) if( a[u][i]!=a[v][i]) ans++; return ans; } int main() { int sum,i,j; cin>>n; memset(a,0,sizeof(a)); m=1; while(1) { i=1; while( (i<=n) &&(a[m][i]==1) ) i++; if(i>n) break; m++; a[m][i]=1; for(j=i+1;j<=n;j++) a[m][j]=a[m-1][j]; } sum=0; for(i=1;i<=m;i++) for(j

10、1;j<=m;j++) sum+=h(i,j); cout<

11、1. #include using namespace std; int n,i,temp,sum,a[100]; int main() { cin>>n; for (i=1;i<=n;i++) cin>>a[i]; for (i=1;i<=n-1;i++) if(a[i]>a[i+1]){ temp=a[i]; a[i]= a[i+1]; a[i+1]=temp; } for (i=n;i>=2;i--) if(a[i]

12、 for (i=2;i<=n-1;i++) sum +=a[i]; cout< using namespace std; int n,i,ans; int gcd(inta,intb) { if(a%b==0) return b; else return gcd(b,a%b); }

13、 int main() { cin>>n; ans=0; for (i=1;i<=n;i++) if(gcd(n,i)== i) ans++; cout< using namespace std; const int SIZE=20; int data[SIZE]; int n,i,h,ans; void merge() { data[

14、h-1]=data[h-1]+data[h]; h--; ans++; } int main() { cin>>n; h= 1; data[h]=1; ans=0; for (i=2;i<=n;i++) { h++; data[h]=1; while(h>1&&data[h]==data[h-1]) merge(); } cout<

15、64+16+8+4 即data[1]=512data[2]=256 data[3]=128 data[4]=64 data[5]=16 data[6]=8 data[7]=4 ans=512-1+256-1+128-1+64-1+16-1+8-1+4-1=2004 输出:2004 NOIP2012-4. #include #include using namespace std; int lefts[20],rights[20],father[20]; string s1,s2,s3; int n,ans; void calc

16、int x,int dep) { ans=ans+dep*(s1[x] -'A'+1); if(lefts[x]>=0)calc(lefts[x],dep+1); if(rights[x]>=0)calc(rights[x],dep+1); } //递归函数,返回ans,累计结点深度*结点权值之和 void check(int x) { if(lefts[x]>=0)check(lefts[x]); s3=s3+s1[x]; if(rights[x]>=0)check(rights[x]); } void dfs(int x,int th) { if(th==n)

17、 { s3=""; check(0); if(s3==s2) { ans=0; calc(0,1); cout<

18、r[th]= -1; rights[x]=-1; } if(father[x]>=0) dfs(father[x],th); } int main() { cin>>s1; //先序遍历序列 cin>>s2; //中序遍历序列 n= s1.size(); memset(lefts, -1,sizeof(lefts)); memset(rights,-1,sizeof(rights)); memset(father,-1,sizeof(father)); dfs(0,1); } 输入: ABCDEF BCAEDF 这是二叉树的遍历题,先根据两个输入的遍历序列

19、确定二叉树。 再根据递归函数计算六个结点深度*权值之和: ans=1*1+2*2+3*3+4*2+5*3+6*3 输出:55 NOIP2013-1. #include #include using namespace  std; int main( ) { string Str; cin>>str; int  n = str.size( ); bool  isPlalindrome = true; for (int  i =0; i

20、drome =false; } if(isPlalindrome) cout<< ”Yes” << endl; else cout<< ”No” << endl; } 输入:abceecba 判断输入的是不是一个回文串,字符串左右颠倒,结果不变。 输出:Yes NOIP2013-2. #include using namespace std; int main( ) { int  a,b,u,v,i, num; cin>>a>>b>>u>>v; num  =0; for  ( i= a; I <=b;  i++) if(((i%u

21、) ==0)||((i%v)==0)) num ++; count < using namespace std; int main( ) { const  int SIZE = 100; int  height[SIZE], num[SIZE],  n, ans; cin>>n; for  (int i=0;  i

22、in>>height[i]; num[i]=1; for  (int j=0;  j= num[i])) num[i]=num[j]+1; } } ans =0; for(int  I = 1; ians) ans =num[j]; } cout <

23、nclude #include using namespace  std; const  int  SIZE = 100; int  n,  m, p,  a[SIZE] [SIZE], count; void  colour  (int x,  int  y) { Count++; a[x][y] = 1; if ((x > 1)&&(a[x-1][y]  == 0)) colour(x - 1, y); if ((y> 1)&&(a[x][y-1]  == 0)) colour(x, y- 1); if ((x < n)&

24、a[x+1][y]  == 0)) colour(x +1, y); if ((y < m)&&(a[x][y+1]  == 0)) colour(x, y+1); } int main( ) { int  i, j,  x,  y, ans; memset(a,  0, sizeof(a)); cin >>n>>m>>p; for(i =1 ; I <=p;  i++) { cin>>x>>y; a[x][y]  = 1; } ans  =  0; for  (i =1; i <=n; i++) for  (j =1; j <=m;j++) if(a[i

25、][j]  ==  0){ count  =  0; colour  (i , j); if  (ans using namespace std; int main() { int a, b, i, tot

26、 c1, c2; cin >> a >> b; tot = 0; for (i = a; i <= b; i++) { c1 = i / 10; c2 = i % 10; if ((c1 + c2) % 3== 0) tot++;  //一个数的各位数之和是3的倍数,它就是3的倍数。 } cout << tot << endl; return 0; } //统计7-31之间有多少数是3的倍数 输入: 7  31 输出: 8 NOIP2014-2. #include using namespace std; int fun(int

27、n, int minNum, int maxNum) { int tot, i; if(n == 0) return1; tot= 0; for(i = minNum; i <= maxNum; i++) tot+= fun(n - 1, i + 1, maxNum); returntot; } int main() { int n, m; cin>> n >> m; cout<< fun(m, 1, n) << endl; return 0; } 输入: 6  3 递归边界:当n=0时,fun(n,minNum,maxNum)=1 fun(3,1,6)=

28、2,2,6)+(2,3,6)+(2,4,6)+(2,5,6)+(2,6,6)+(2,7,6)=20 fun(2,2,6)=(1,3,6)+(1,4,6)+(1,5,6)+(1,6,6)+(1,7,6)=10 fun(2,3,6)=(1,4,6)+(1,5,6)+(1,6,6)+(1,7,6)=6 fun(2,4,6)=(1,5,6)+(1,6,6)+(1,7,6)=3 fun(2,5,6)=(1,6,6)+(1,7,6)=1 fun(2,6,6)=(1,7,6)=0 fun(1,3,6)=(0,4,6)+(0,5,6)+(0,6,6)+(0,7,6)=4 fun(1,4,6)=

29、0,5,6)+(0,6,6)+(0,7,6)=3 fun(1,5,6)=(0,6,6)+(0,7,6)=2 fun(1,6,6)=(0,7,6)=1 fun(1,7,6)=0 输出: 20 NOIP2014-3. #include #include using namespace std; const int SIZE = 100; int main() { string dict[SIZE]; int rank[SIZE]; int ind[SIZE]; int i, j, n, tmp; cin >> n; f

30、or (i = 1; i <= n; i++) { rank[i] = i; ind[i] = i; cin >>dict[i]; } for  (i= 1; i < n; i++) for (j = 1; j<= n - i; j++) if (dict[ind[j]]> dict[ind[j + 1]]){ tmp = ind[j]; ind[j] = ind[j +1]; ind[j + 1] = tmp; } //冒泡排序 for (i = 1; i <= n; i++) rank[ind[i]] = i; //输出dict里字符排序后应该在的位置 for

31、i = 1; i <= n; i++) cout < using namespace std; const int SIZE = 100; int alive[SIZE]; int n; int next(int num) { do { num++; if (num > n) num =

32、 1; } while (alive[num] == 0); return num; } int main() { int m, i, j, num; cin >> n >> m; for (i = 1; i <= n; i++) alive[i] = 1; num = 1; for (i = 1; i <= n; i++) { for (j = 1; j

33、dl; return 0; } 输入: 11 3 这就是约瑟夫环问题,11个人围一圈,从1开始报数,报到3的出局,再从出局的下一个人开始报1,直到全部出局,依次输出出局人的编号。 输出: 3 6 9 1 5 10 4 11 8 2 7 NOIP2015-1. //同普及组阅读题NOIP2015-2 #include using namespace std; struct point { int x; int y; }; int main() { struct EX{ int a; int b; point c; }e; e.a=

34、 1; e.b= 2; e.c.x= e.a + e.b; e.c.y= e.a * e.b; cout<< e.c.x << ',' << e.c.y << endl; return 0; } 输出: 3,2 //注意输出有逗号 NOIP2015-2. //同普及组阅读题NOIP2015-4 #include using namespace std; void fun(char *a, char *b) { a = b; (*a)++; } int main() { char c1, c2, *p1, *p2; c1 = 'A';

35、 c2 = 'a'; p1 = &c1; p2 = &c2; fun(p1, p2); cout << c1 << c2 << endl; return 0; } //指针题,注意*a、&a、'a'的区别。 输出: Ab NOIP2015-3. #include #include using namespace std; int main() { int len, maxlen; string s, ss; maxlen = 0; do { cin >> ss; len = ss.length(); if (

36、ss[0] == '#') break; if (len >maxlen) { s = ss; maxlen = len; }//输出长度最长的字符串s } while (true); cout << s << endl; return 0; } 输入: I am a citizen of China # 输出: citizen NOIP2015-4. #include using namespace std; int fun(int n, int fromPos, int toPos) { int t, tot; i

37、f (n == 0) return 0; for (t = 1; t <= 3; t++) if (t != fromPos&& t != toPos) break; tot = 0; tot += fun(n - 1, fromPos, t); tot++; tot += fun(n - 1, t, toPos); return tot; } int main() { int n; cin >> n; cout << fun(n, 1, 3) << endl; return 0; } 输入: 5 递归边界:当n=0时,fun(n,fromPos,toPo

38、s)=0 fun(5,1,3)=(4,*,*)+1+(4,*,*)=31 fun(4,*,*)=(3,*,*)+1+(3,*,*)=15 fun(3,*,*)=(2,*,*)+1+(2,*,*)=7 fun(2,*,*)=(1,*,*)+1+(1,*,*)=3 fun(1,*,*)=(0,*,*)+1+(0,*,*)=1 输出: 31 NOIP2016-1. #include using namespace std; int main() { int a[6] = {1, 2, 3, 4, 5, 6}; int pi = 0; int pj

39、 = 5; intt , i; while (pi < pj) { t = a[pi]; a[pi] = a[pj]; a[pj] = t; pi++; pj--; } for (i = 0; i < 6; i++) cout<< a[i] << ","; cout << endl; return 0; }//倒序输出,注意逗号 输出:6,5,4,3,2,1, NOIP2016-2. #include using namespace std; int main() { char a[100][100], b[100][100];

40、 string c[100]; string tmp; intn, i = 0, j = 0, k = 0, total_len[100], length[100][3]; cin >> n; getline(cin, tmp); for (i = 0; i < n; i++) { getline(cin, c[i]); total_len[i] = c[i].size(); //记录c[i]的长度 } for (i = 0; i < n; i++) { j = 0; while (c[i][j] != ':') { a[i][k] = c[i][j]; //扫描c

41、[i],当c[i]的第j个字符不为":"时,将c[i]的字符存入a[i][k]中,即把c[i]字符串":"前的所有字符存入a[i][k]中,将c[i][0]-->c[i][j]中的字符存入a[i][0]-->a[i][k](k==j)中。 k = k + 1; j++; } length[i][1] = k - 1; //记录":"前的字符的个数 a[i][k] = 0; //记录":"所在的位置 k = 0; for (j = j + 1; j < total_len[i]; j++) { b[i][k] = c[i][j]; //由于j是扫描到":"后的值再+1,所以此

42、时的c[i][j]为":"后输入的字符,并将其存入b[i][k]中 k = k + 1; } length[i][2] = k - 1; //记录":"后的字符的个数 b[i][k] = 0; //记录终点位置 k = 0; } for (i = 0; i < n; i++) { if (length[i][1] >=length[i][2]) cout << "NO,"; //如果":"前的字符比":"后的字符个数多,输出"NO," else { k = 0; for (j = 0; j < length[i][2];j++) { if (a[i][k] == b

43、[i][j]) //如果":"前的字符在":"后有出现 k = k + 1; //找下一个":"前的符是否有出现,是从当前位置往后找 if (k > length[i][1]) break; //如果k的值比":"前的字符长度大,即已经找完了":"前的所有字符,那么退出循环 } if (j == length[i][2]) cout << "NO,"; //如果j的值和":"后的字符串长度相等,即在扫描到最后一个点时,无论":"前的字符是否被全部找完,都输出"NO," else cout << "YES,"; //如果在找完字符串之前已经找到了":"前的字符,那么输出

44、"YES," } } cout << endl; return 0; } 输入: 3 AB:ACDEbFBkBD AR:ACDBrT SARS:Severe Atypical Respiratory Syndrome 对!就是判断冒号前的字母是否在冒号后的字符串中出现,大小写要区分,注意有逗号。 输出:YES,NO,YES, (注:输入各行前后均无空格) NOIP2016-3. #include using namespace std; int lps(string seq, int i, int j){ int len1, len2

45、 if (i == j) return 1; //当i=j时,则此时扫描到的项是一定可以放入该回文子序列中,长度贡献为1 if (i > j) return 0; //当i>j时,即扫描到的左边的数在右边已经扫描过了,所以该项及往后的所有项都是已经扫描过的项,长度贡献为0 if(seq[i] == seq[j]) //当扫描到相同的字符时 return lps(seq, i + 1, j - 1) + 2; //此时这两个相同字符必定可以放入回文子序列中,长度贡献为2 len1= lps(seq, i, j - 1); len2= lps(seq, i + 1, j);

46、 //如果没有扫描到相同字符,则此时有两种情况,一种是此时的第i个字符对最长回文子序列的长度有贡献,另一种是此时的第j个字符对最长回文子序列的长度有贡献 if(len1 > len2) return len1; return len2; //比较上面两种情况的回文子序列的长度大小,返回其中长度较大的回文子序列的长度 } int main() { string seq = "acmerandacm"; int n = seq.size(); cout<< lps(seq, 0, n - 1) << endl; return 0; } //对!就是计算最长回文子序列长度

47、 输出:5 NOIP2016-4. #include #include using namespace std; int map[100][100]; int sum[100], weight[100]; int visit[100]; int n; void dfs(int node) { visit[node] = 1; sum[node] = 1; int v, maxw = 0; for (v = 1; v <= n; v++) { if (!map[node][v] || visit[v]) continu

48、e; dfs(v); sum[node] += sum[v]; if (sum[v] > maxw) maxw = sum[v]; } if (n - sum[node] > maxw) maxw = n - sum[node]; weight[node] = maxw; } int main() { memset(map, 0, sizeof(map)); memset(sum, 0, sizeof(sum)); memset(weight, 0, sizeof(weight)); memset(visit, 0, sizeof(visit)); cin >>

49、 n; int i, x, y; for (i = 1; i < n; i++) { cin >> x >> y; map[x][y] = 1; map[y][x] = 1; } dfs(1); int ans = n, ansN = 0; for (i = 1; i <= n; i++) if (weight[i] < ans) { ans = weight[i]; ansN = i; } cout << ansN << "" << ans << endl; return 0; } 输入:11 1 2 1 3 2 4 2 5 2 6 3 7 7 8 7 11 6 9 9 10 对!这是图的深度优先遍历。确定哪个节点是重心,以及最大联通块包含的节点数。根据输入的节点信息画出树型图即可模拟出来。[1][2]、[2][4]、[2][5]、[2][6],该图连接节点2有四条边,共5个节点。 输出:2 5

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服