1、蓝桥杯初赛b组试题第一题结果填空 3奖券数目有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10-99),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。请提交该数字(一个整数),不要写任何多余的内容或说明性文字。-题解:考试的时候写了个回溯法,然后屁颠屁颠的开始做下面一题了。结果错了_ 1 #include 2usingnamespacestd; 3boolfuck(int t) 4 5while(t) 6 7if(t%10=4)retu
2、rnfalse; 8 t/=10; 9 10returntrue;11 12intmain()13 14intans = 0, t = 10;15while(t100)16if(fuck(t+)ans+;17coutansendl;18return0;19 第一题正确答案:52488(我居然上来第一题就错了居然写了13440_)/cout8*9*9*9*9; _第二题结果填空 5星系炸弹在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。每个炸弹都可以设定多少天之后爆炸。比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。有一个贝塔炸弹,20
3、14年11月9日放置,定时为1天,请你计算它爆炸的准确日期。请填写该日期,格式为yyyy-mm-dd即4位年份2位月份2位日期。比如:2015-02-19请严格按照格式书写。不能出现其它文字或符号。-题解:不用废话,直接手算顶多3分钟,注意2016是闰年正确答案:2017-08-05第三题结果填空 9三羊献瑞观察下面的加法算式: 祥瑞生辉+ 三羊献瑞-三羊生瑞气(如果有对齐问题,可以参看【图1.jpg】)其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。-题解:水题,给“祥瑞生辉三羊献气”编号01234567,直接
4、回溯穷举即可 1 #include 2usingnamespacestd; 3inta8; 4boolb10; 5voiddfs(int cur) 6 7if(cur = 8) 8 9int x = a0*1+a1*100+a2*10+a3,y = a4*1+a5*100+a6*10+a1, z=a4*10+a5*1+a2*100+a1*10+a7;10if(x+y=z)couta4a5a6a1endl;11 12else13 14for(inti = 0; i10; i+)15 16if(cur = 0&i = 0)continue;17if(cur = 4&i = 0)continue;1
5、8if(!bi)19 20 bi=1;21acur=i;22dfs(cur+1);23 bi=0;24 25 26 27 28intmain()29 30dfs(0);31return0;32 第三题正确答案:1085第四题代码填空11格子中输出StringInGrid函数会在一个指定大小的格子中打印指定的字符串。要求字符串在水平、垂直两个方向上都居中。如果字符串太长,就截断。如果不能恰好居中,可以稍稍偏左或者偏上一点。下面的程序实现这个逻辑,请填写划线部分缺少的代码。 1 #include 2 #include 3 4voidStringInGrid(int width, int heigh
6、t, constchar* s) 5 6inti, k; 7charbuf1; 8strcpy(buf, s); 9if (strlen(s)width - 2) bufwidth - 2 = 0;1011printf(+);12for (i = 0; iwidth - 2; i+) printf(-);13printf(+n);1415for (k = 1; k(height - 1) / 2; k+)16 17printf();18for (i = 0; iwidth - 2; i+) printf();19printf(n);20 2122printf();2324printf(%*s%
7、s%*s, _); /填空2526printf(n);2728for (k = (height - 1) / 2 + 1; kheight - 1; k+)29 30printf();31for (i = 0; iwidth - 2; i+) printf();32printf(n);33 3435printf(+);36for (i = 0; iwidth - 2; i+) printf(-);37printf(+n);38 3940intmain()41 42StringInGrid(20, 6, abcd1234);43return0;44 对于题目中数据,应该输出:+ abcd1234
8、 +(如果出现对齐问题,参看【图1.jpg】)注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。-题解:我是一名OI党,入门直接学的是C+,结果考了个printf里面%*s的用法。太特么冷门了,穷举了没试出来,原来后面的参数要跟两个。分数11分怒丢正确答案:(width-strlen(s)-2)/2,s,(width-strlen(s)-1)/2,备注:答案可以形式多样性,只要代入使得代码成立即可,但要注意奇偶问题所以后面一个要+1不然sample过了也是错的第五题代码填空13九数组分数1,2,3.9 这九个数字组成一个分数,其值恰好为1/3,如何组法?下面的程序实现了该功能,请填
9、写划线部分缺失的代码。 1 #include 2 3voidtest(int x) 4 5int a = x0 * 1 + x1 * 100 + x2 * 10 + x3; 6int b = x4 * 10 + x5 * 1 + x6 * 100 + x7 * 10 + x8; 7 8if (a * 3 = b) printf(%d / %dn, a, b);9 1011voidf(int x, int k)12 13inti, t;14if (k = 9)15 16 test(x);17return;18 1920for (i = k; i9; i+)21 22 t = xk; xk = x
10、i; xi = t; 23 f(x, k + 1);24 _ / 填空处25 26 2728intmain()29 30intx = 1, 2, 3, 4, 5, 6, 7, 8, 9 ;31 f(x, 0);32return0;33 注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。-题解:水题,回溯法的最最基本常识,全局变量回溯完成后必须更改回初值正确答案:t=xk; xk=xi; xi=t;备注:1.答案可以形式多样性,只要代入使得代码成立即可2.我个人认为一个横线可以填多个语句,所以去掉大括号,或者利用原有t值少写一句子no problem第六题结果填空17加法变乘法我们都
11、知道:1+2+3+ . + 49 = 1225现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015比如:1+2+3+.+10*11+12+.+27*28+29+.+49 = 2015就是符合要求的答案。请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。注意:需要你提交的是一个整数,不要填写任何多余的内容。-题解:水题,一共是48个位置,C(48,2)扣掉连在一起的情况,穷举一遍过即可。 1 #include 2usingnamespacestd; 3intmain() 4 5for(inti = 1; i47; i+) 6for(int j =
12、 i + 2; j 49; j+) 7 8int sum = 0; 9for(int k = 1; k i; k+)sum+=k;10 sum+=i*(i+1);11for(int k = i+2; k j; k+)sum+=k;12 sum+=j*(j+1);13for(int k = j+2; k 50; k+)sum+=k;14if(sum=2015)coutiendl;15 16return0;17 第六题正确答案:16第七题结果填空21牌型种数小明被劫持到X赌城,被迫与其他3人玩牌。一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。这时,小明脑子里突然冒出一个问题:
13、如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?请填写该整数,不要填写任何多余的内容或说明文字。-题解:水题,一共是记号为A,2,3,4,5,6,7,8,9,10,J,Q,k的十三个元素,每个元素的情况可能是0,1,2,3,4。这十三个元素的和为13即可。回溯穷举再剪枝即可。 1 #include 2usingnamespacestd; 3intans = 0, sum = 0; 4voiddfs(int cur) 5 6if (sum13)return; 7if (cur = 13) 8 9if (sum = 13)ans+;10ret
14、urn;11 12else13 14for (inti = 0; i5; i+)15 16 sum += i;17dfs(cur + 1);18 sum -= i;19 20 21 22intmain()23 24dfs(0);25coutansendl;26return0;27 第七题正确答案:3598180第八题程序设计 15移动距离X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3.当排满一行时,从下一行相邻的楼往反方向排号。比如:当小区排号宽度为6时,开始情形如下:1 2 3 4 5 612 11 10 9 8 713 14 15 .我们的问题是:已知了两个楼
15、号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)输入为3个整数w m n,空格分开,都在1到10范围内w为排号宽度,m,n为待计算的楼号。要求输出一个整数,表示m n 两楼间最短移动距离。例如:用户输入:6 8 2则,程序应该输出:4再例如:用户输入:4 7 20则,程序应该输出:5资源约定:峰值内存消耗 256MCPU消耗 1ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入.” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意: main函数需要返回0注意: 只使用ANSI C/ANSI C+ 标准,不要调用依赖于编译环境或操作系统的特殊函数。注意
16、: 所有依赖的函数必须明确地在源文件中 #include ,不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。-题解:从分值上都能看出来是水题。比前面两个填空题的分值都低。最简单的做法,小学生都会的,用数论的完全剩余系,我们强行更改矩阵的编号比如题目中的强行更改为:0 1 2 3 4 5 11 10 9 8 7 612 13 14.这样就算起来非常方便了,要求的答案就是坐标之差#include #include usingnamespacestd;int main()intw,m,n;cinwmn;m-;n-;int m1=m/w, m2=m%w;if(m1&1)m2=w-
17、1-m2;int n1=n/w, n2=n%w;if(n1&1)n2=w-1-n2;coutabs(m1-n1)+abs(m2-n2)endl;return0;第八题第九题程序设计 25垒骰子赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。经过长期观察,atm发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。atm想计算一下有多少种不同的可能的垒骰子方式。两种垒骰子方式相同,当且仅当这两种方式中对应
18、高度的骰子的对应数字的朝向都相同。由于方案数可能过多,请输出模 109 + 7 的结果。不要小看了atm的骰子数量哦输入格式第一行两个整数 n mn表示骰子数目接下来 m 行,每行两个整数 a b ,表示 a 和 b 数字不能紧贴在一起。输出格式一行一个数,表示答案模 109 + 7 的结果。样例输入2 11 2样例输出544数据范围对于 30% 的数据:n = 5对于 60% 的数据:n = 100对于 100% 的数据:0 n = 109, m = 36资源约定:峰值内存消耗 256MCPU消耗 2ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入.” 的多余内容。所有代码放在同一个
19、源文件中,调试通过后,拷贝提交该源码。注意: main函数需要返回0注意: 只使用ANSI C/ANSI C+ 标准,不要调用依赖于编译环境或操作系统的特殊函数。注意: 所有依赖的函数必须明确地在源文件中 #include ,不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。-题解:终于不是水题了,然而却没全做出来。难度跳跃太大。考场上,我先用dfs做,结果数字大于5的时间就hold不住了,于是果断改成记忆化动态规划,但是只能到一万,实在没办法了。大神跟我说用矩阵快速幂做,所以现在立马现学现用。程序有空补。【考场程序】讲解:利用记忆化DP穷举底面衔接的所有情况,dppq表示
20、第p层底面是q的情况种数,侧面是相互独立的最后乘以4n即可比如提给数据就是34再乘上两个4。但是上限1实在是达不到了。 1 #include 2 #include 3#define N 1007 4usingnamespacestd; 5/考场上我用的map现在想想发现多余了 6into7 = 0, 4, 5, 6, 1, 2, 3 ; 7boolfuck77; 8int n, m; 9longlongans = 0;10constintmaxn = 25;11longlongdpmaxn7;12longlongdfs(int cur, int p)13 14if (cur = n) retu
21、rn1;15else16 17if (dpcurp = 0)returndpcurp;18longlong t = 0;19for (inti = 1; i n m;32for (inti = 0; i t1 t2;36fuckt1t2 = 1;37fuckt2t1 = 1;38 39for (inti = 1; i7; i+)40 41ans+=dfs(1, i);42ans %= N;43 44for (inti = 0; i n; i+)45 46ans *= 4;47ans %= N;48 49coutansendl;50return0;51 考场程序,数据不够大所以要扣分,最大只能到
22、10【AC版本】:矩阵快速幂同理我们只考虑底面的情况,最后乘上4n即可。我们设六阶矩阵An,其中An的第a行第b列表示第一层底面数字为a、第n层数字为b的所有排列的情况记六阶矩阵X中,第a行第b列表示相邻两层的是否能成功连接的情况。a和b能连则为1,a和b不能连则为0(注意是相邻两层的底面,不是衔接面,所以要转化,比如题给的1 2要改为1 5)根据上述定义,易得递推式:An= An-1X,且 A1= E(六阶单位矩阵)可得到An的表达式为An= Xn-1那么ans就是矩阵Xn-1的36个元素之和注意最后侧面的4n也要二分幂不然会爆炸 1 #include 2 #include 3#define
23、 N 1007 4usingnamespacestd; 5 6struct Matrix 7 8longlonga66; 9Matrix(int x)10 11memset(a, 0, sizeof(a);12for (inti = 0; i6; i+) aii = x;13 14 ;1516 Matrix operator*(const Matrix& p, const Matrix& q) 17 18 Matrix ret(0);19for (inti = 0; i6; i+)20for (int j = 0; j 6; j+)21for (int k = 0; k = 1;37 38re
24、turn ret;39 4041intmain()42 43 Matrix z(0);44for (inti = 0; i6; i+) 45for (int j = 0; j n m; 51for (inti = 0; i t1 t2;55z.at1 - 1(t2 + 2) % 6 = 0;56z.at2 - 1(t1 + 2) % 6 = 0;57 58 Matrix ret(0);59 ret = fast_mod(z, n - 1);60longlongans = 0;61for (inti = 0; i6; i+)62 63for (int j = 0; j = 1;80 81coutansendl;82return0;83 矩阵快速幂第十题程序设计 31生命之树在X森林里,上帝创建了生命之树。他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值。上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都存在一个点列 a, v1, v2, ., vk, b 使得这个点列中的每个点都是S里面的元素,且序列中相邻两个点间有一条边相连。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1