《noip复赛分析总结归纳(c++~).doc》由会员分享,可在线阅读,更多相关《noip复赛分析总结归纳(c++~).doc(28页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、|noip 复赛总结归纳(2010 至 2015 年 c+普及组复赛试题)一、【题目】1数字统计(two.pas/c/cpp)【问题描述】请统计某个给定范围L, R的所有整数中,数字 2 出现的次数。比如给定范围2, 22,数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出现 1 次,在数 21 中出现 1 次,在数 22 中出现 2 次,所以数字2 在该范围内一共出现了 6 次。【输入】输入文件名为 two.in。输入共 1 行,为两个正整数 L 和 R,之间用一个空格隔开。【输出】输出文件名为 two.out。输出共 1 行,表示数字 2 出现的次数。【输入
2、输出样例 1】two.in two.out 2 22 6 【输入输出样例 2】two.in two.out 2 100 20 【数据范围】1 L R 10000。【算法】把每一位分出来,一一判断【代码】#includeusing namespace std;int main()int r,l,ans=0;scanf(“%d%d“,for(int i=r;i0)/把每一位分离if(num%10=2)ans+;num/=10;| printf(“%d“,ans);return 0;【年份】2010二、【题目】2接水问题(water.pas/c/cpp)【问题描述】学校里有一个水房,水房里一共装有
3、m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1。现在有 n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 1 到 n 编号,i 号同学的接水量为 wi。接水开始时,1 到 m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学 j 完成其接水量要求wj 后,下一名排队等候接水的同学 k 马上接替 j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即 j 同学第 x 秒结束时完成接水,则 k 同学第 x+1 秒立刻开始接水。若当前接水人数 n不足 m,则只有n个龙头供水,其它 m-n个龙头关闭。现在给出 n 名同学的接水量,按
4、照上述接水规则,问所有同学都接完水需要多少秒。【输入】输入文件名为 water.in。第 1 行 2 个整数 n 和 m,用一个空格隔开,分别表示接水人数和龙头个数。第 2 行 n 个整数 w1、w2、wn,每两个整数之间用一个空格隔开,wi 表示 i 号同学的接水量。【输出】输出文件名为 water.out。输出只有一行,1 个整数,表示接水所需的总时间。【输入输出样例 1】water.in water.out 5 3 4 4 4 1 2 1 【输入输出样例 1 说明】第 1 秒,3 人接水。第 1 秒结束时,1、2、3 号同学每人的已接水量为 1,3 号同学接完水,4 号同学接替 3 号同
5、学开始接水。第 2 秒,3 人接水。第 2 秒结束时,1、2 号同学每人的已接水量为 2,4 号同学的已接水量为 1。第 3 秒,3 人接水。第 3 秒结束时,1、2 号同学每人的已接水量为 3,4 号同学的已接水量为 2。4 号 i 同学接完水,5 号同学接替 4 号同 i 学开始接水。第 4 秒,3 人接水。第 4 秒结束时,1、2 号同学每人的已接水量为 4,5 号同学的已接水量为 1。1、2、5 号 i 同学接完水,即所有人完成接水。|总接水时间为 4 秒。【输入输出样例 2】water.in water.out 8 423 71 87 32 70 93 80 76 163 【数据范围
6、】1 n 10000,1 m 100 且 m n;1 wi 100。【算法】把人数分为两部分,一人对一个水龙头,作为第一部分,剩下是第二部分的,每一次从第一部分找一个时间最少人,把第二部分的一个人加进去。【代码】#includeint w10005;int main()int i,j,m,n;scanf(“%d%d“,for (i=1;iwj)k=j;wk+=wi;int k=1;for (i=2;i#include#include|#include#includeusing namespace std;int n,a10001000,ans,maxx;int main()scanf(“%d“
7、,for(int i=1;iaimaxx)maxx=j;aimaxx=0;for(int j=1;j#include#include#include#includeusing namespace std;int main()char a20120;gets(a); int b,len=strlen(a);if(a0=0)cout=0;i-)if(f=1|ai!=0)int main(void)char a1010100,ch1010;gets(ch);gets(a);for (int i=0;i=ascanf(“%d“, for (int i=2;ii)printf(“%dn“,n);retu
8、rn 0; else|printf(“%dn“,i);return 0; 【年份】2012七、【题目】2寻宝(treasure.cpp/c/pas) 【问题描述】传说很遥远的藏宝楼顶层藏着诱人的宝藏。小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书。说明书的内容如下:藏宝楼共有 N+1 层,最上面一层是顶层,顶层有一个房间里面藏着宝藏。除了顶层外,藏宝楼另有 N 层,每层 M 个房间,这 M 个房间围成一圈并按逆时针方向依次编号为 0,M-1。其中一些房间有通往上一层的楼梯,每层楼的楼梯设计可能不同。每个房间里有一个指示牌,指示牌上有一个数字
9、x,表示从这个房间开始按逆时针方向选择第 x 个有楼梯的房间(假定该房间的编号为 k),从该房间上楼,上楼后到达上一层的 k 号房间。比如当前房间的指示牌上写着 2,则按逆时针方向开始尝试,找到第 2 个有楼梯的房间,从该房间上楼。如果当前房间本身就有楼梯通向上层,该房间作为第一个有楼梯的房间。寻宝说明书的最后用红色大号字体写着:“寻宝须知:帮助你找到每层上楼房间的指示牌上的数字(即每层第一个进入的房间内指示牌上的数字)总和为打开宝箱的密钥”。请帮助小明算出这个打开宝箱的密钥。【输入】输入文件为 treasure.in。+第一行 2 个整数 N 和 M,之间用一个空格隔开。N 表示除了顶层外藏宝楼共 N 层楼,M 表示除顶层外每层楼有 M 个房间。接下来 N*M 行,每行两个整数,之间用一个空格隔开,每行描述一个房间内的情况,其中第(i-1)*M+j 行表示第 i 层 j-1 号房间的情况(i=1, 2, , N;j=1, 2, ,M)。第一个整数表示该房间是否有楼梯通往上一层(0 表示没有,1 表示有),第二个整数表示指示牌上的数字。注意,从 j 号房间的楼梯爬到上一层到达的房间一定也是 j 号房间。最后一行,一个整数,表示小明从藏宝楼底层的几号房间进入开始寻宝(注:房间编号从 0 开始)。【输出】
限制150内