蓝桥杯初赛b组试题_第1页
蓝桥杯初赛b组试题_第2页
蓝桥杯初赛b组试题_第3页
蓝桥杯初赛b组试题_第4页
蓝桥杯初赛b组试题_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第一题 结果填空 3奖券数目有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10-99),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。请提交该数字(一个整数),不要写任何多余的内容或说明性文字。-题解:考试的时候写了个回溯法,然后屁颠屁颠的开始做下面一题了。结果错了_ 1 #include 2 using namespace std; 3 bool fuck(int t) 4 5 while(t) 6 7 if(t%10=4)retur

2、n false; 8 t/=10; 9 10 return true;11 12 int main()13 14 int ans = 0, t = 10;15 while(t100)16 if(fuck(t+)ans+;17 coutansendl;18 return 0;19 第一题正确答案:52488(我居然上来第一题就错了 居然写了13440_)/cout8*9*9*9*9; _第二题 结果填空 5星系炸弹在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。每个炸弹都可以设定多少天之后爆炸。比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日

3、爆炸。有一个贝塔炸弹,2014年11月9日放置,定时为1天,请你计算它爆炸的准确日期。请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19请严格按照格式书写。不能出现其它文字或符号。-题解:不用废话,直接手算顶多3分钟,注意2016是闰年正确答案:2017-08-05第三题 结果填空 9三羊献瑞观察下面的加法算式: 祥 瑞 生 辉+ 三 羊 献 瑞-三 羊 生 瑞 气(如果有对齐问题,可以参看【图1.jpg】)其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。-题解:水

4、题,给“祥瑞生辉三羊献气”编号01234567,直接回溯穷举即可 1 #include 2 using namespace std; 3 int a8; 4 bool b10; 5 void dfs(int cur) 6 7 if(cur = 8) 8 9 int 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;10 if(x+y=z)couta4a5a6a1endl;11 12 else13 14 for(int i = 0; i 10; i+)15 16 if(cur = 0&i

5、 = 0)continue;17 if(cur = 4&i = 0)continue;18 if(!bi)19 20 bi=1;21 acur=i;22 dfs(cur+1);23 bi=0;24 25 26 27 28 int main()29 30 dfs(0);31 return 0;32 第三题正确答案:1085第四题 代码填空11格子中输出StringInGrid函数会在一个指定大小的格子中打印指定的字符串。要求字符串在水平、垂直两个方向上都居中。如果字符串太长,就截断。如果不能恰好居中,可以稍稍偏左或者偏上一点。下面的程序实现这个逻辑,请填写划线部分缺少的代码。 1 #includ

6、e 2 #include 3 4 void StringInGrid(int width, int height, const char* s) 5 6 int i, k; 7 char buf1; 8 strcpy(buf, s); 9 if (strlen(s)width - 2) bufwidth - 2 = 0;10 11 printf(+);12 for (i = 0; iwidth - 2; i+) printf(-);13 printf(+n);14 15 for (k = 1; k(height - 1) / 2; k+)16 17 printf();18 for (i = 0

7、; iwidth - 2; i+) printf( );19 printf(n);20 21 22 printf();23 24 printf(%*s%s%*s, _); /填空25 26 printf(n);27 28 for (k = (height - 1) / 2 + 1; kheight - 1; k+)29 30 printf();31 for (i = 0; iwidth - 2; i+) printf( );32 printf(n);33 34 35 printf(+);36 for (i = 0; iwidth - 2; i+) printf(-);37 printf(+n)

8、;38 39 40 int main()41 42 StringInGrid(20, 6, abcd1234);43 return 0;44 对于题目中数据,应该输出:+ abcd1234 +(如果出现对齐问题,参看【图1.jpg】)注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。-题解:我是一名OI党,入门直接学的是C+,结果考了个printf里面%*s的用法。太特么冷门了,穷举了没试出来,原来后面的参数要跟两个。分数11分怒丢正确答案:(width-strlen(s)-2)/2,s,(width-strlen(s)-1)/2,备注:答案可以形式多样性,只要代入使得代码成立即可

9、,但要注意奇偶问题所以后面一个要+1不然sample过了也是错的第五题 代码填空13九数组分数1,2,3.9 这九个数字组成一个分数,其值恰好为1/3,如何组法?下面的程序实现了该功能,请填写划线部分缺失的代码。 1 #include 2 3 void test(int x) 4 5 int a = x0 * 1 + x1 * 100 + x2 * 10 + x3; 6 int b = x4 * 10 + x5 * 1 + x6 * 100 + x7 * 10 + x8; 7 8 if (a * 3 = b) printf(%d / %dn, a, b); 9 10 11 void f(int

10、 x, int k)12 13 int i, t;14 if (k = 9)15 16 test(x);17 return;18 19 20 for (i = k; i9; i+)21 22 t = xk; xk = xi; xi = t; 23 f(x, k + 1);24 _ / 填空处25 26 27 28 int main()29 30 int x = 1, 2, 3, 4, 5, 6, 7, 8, 9 ;31 f(x, 0);32 return 0;33 注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。-题解:水题,回溯法的最最基本常识,全局变量回溯完成后必须更改回初值

11、正确答案:t=xk; xk=xi; xi=t;备注:1.答案可以形式多样性,只要代入使得代码成立即可2.我个人认为一个横线可以填多个语句,所以去掉大括号,或者利用原有t值少写一句子no problem第六题 结果填空17加法变乘法我们都知道:1+2+3+ . + 49 = 1225现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015比如:1+2+3+.+10*11+12+.+27*28+29+.+49 = 2015就是符合要求的答案。请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。注意:需要你提交的是一个整数,不要填写任何多余的内容。-题解:

12、水题,一共是48个位置,C(48,2)扣掉连在一起的情况,穷举一遍过即可。 1 #include 2 using namespace std; 3 int main() 4 5 for(int i = 1; i 47; i+) 6 for(int j = i + 2; j 49; j+) 7 8 int sum = 0; 9 for(int k = 1; k i; k+)sum+=k;10 sum+=i*(i+1);11 for(int k = i+2; k j; k+)sum+=k;12 sum+=j*(j+1);13 for(int k = j+2; k 50; k+)sum+=k;14

13、if(sum=2015)coutiendl;15 16 return 0;17 第六题正确答案:16第七题 结果填空21牌型种数小明被劫持到X赌城,被迫与其他3人玩牌。一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。这时,小明脑子里突然冒出一个问题:如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?请填写该整数,不要填写任何多余的内容或说明文字。-题解:水题,一共是记号为A,2,3,4,5,6,7,8,9,10,J,Q,k的十三个元素,每个元素的情况可能是0,1,2,3,4。这十三个元素的和为13即可。回溯穷举再剪枝即可

14、。 1 #include 2 using namespace std; 3 int ans = 0, sum = 0; 4 void dfs(int cur) 5 6 if (sum13)return; 7 if (cur = 13) 8 9 if (sum = 13)ans+;10 return;11 12 else13 14 for (int i = 0; i 5; i+)15 16 sum += i;17 dfs(cur + 1);18 sum -= i;19 20 21 22 int main()23 24 dfs(0);25 cout ans endl;26 return 0;27

15、第七题正确答案:3598180第八题 程序设计 15移动距离X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3.当排满一行时,从下一行相邻的楼往反方向排号。比如:当小区排号宽度为6时,开始情形如下:1 2 3 4 5 612 11 10 9 8 713 14 15 .我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)输入为3个整数w m n,空格分开,都在1到10范围内w为排号宽度,m,n为待计算的楼号。要求输出一个整数,表示m n 两楼间最短移动距离。例如:用户输入:6 8 2则,程序应该输出:4再例如:用户输入:4 7 20则,

16、程序应该输出:5资源约定:峰值内存消耗 256MCPU消耗 1ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入.” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意: main函数需要返回0注意: 只使用ANSI C/ANSI C+ 标准,不要调用依赖于编译环境或操作系统的特殊函数。注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。-题解:从分值上都能看出来是水题。比前面两个填空题的分值都低。最简单的做法,小学生都会的,用数论的完全剩余系,我们强行更改矩阵的编号比如题目中的强行

17、更改为:0 1 2 3 4 5 11 10 9 8 7 612 13 14.这样就算起来非常方便了,要求的答案就是坐标之差#include #include using namespace std;int main() int w,m,n; cinwmn; m-;n-; int m1=m/w, m2=m%w; if(m1&1)m2=w-1-m2; int n1=n/w, n2=n%w; if(n1&1)n2=w-1-n2; coutabs(m1-n1)+abs(m2-n2)endl; return 0;第八题第九题程序设计 25垒骰子赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,

18、不能歪歪扭扭,要垒成方柱体。经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。atm想计算一下有多少种不同的可能的垒骰子方式。两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。由于方案数可能过多,请输出模 109 + 7 的结果。不要小看了 atm 的骰子数量哦输入格式第一行两个整数 n mn表示骰子数目接下来 m 行,每行两个整数 a b ,表示 a 和 b 数字不能紧贴在一起。输出格式

19、一行一个数,表示答案模 109 + 7 的结果。样例输入2 11 2样例输出544数据范围对于 30% 的数据:n = 5对于 60% 的数据:n = 100对于 100% 的数据:0 n = 109, m = 36资源约定:峰值内存消耗 256MCPU消耗 2ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入.” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意: main函数需要返回0注意: 只使用ANSI C/ANSI C+ 标准,不要调用依赖于编译环境或操作系统的特殊函数。注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而

20、省略常用头文件。提交时,注意选择所期望的编译器类型。-题解:终于不是水题了,然而却没全做出来。难度跳跃太大。考场上,我先用dfs做,结果数字大于5的时间就hold不住了,于是果断改成记忆化动态规划,但是只能到一万,实在没办法了。大神跟我说用矩阵快速幂做,所以现在立马现学现用。程序有空补。【考场程序】讲解:利用记忆化DP穷举底面衔接的所有情况,dppq表示第p层底面是q的情况种数,侧面是相互独立的最后乘以4n即可比如提给数据就是34再乘上两个4。但是上限1实在是达不到了。 1 #include 2 #include 3 #define N 1007 4 using namespace std;

21、5 /考场上我用的map现在想想发现多余了 6 int o7 = 0, 4, 5, 6, 1, 2, 3 ; 7 bool fuck77; 8 int n, m; 9 long long ans = 0;10 const int maxn = 25;11 long long dpmaxn7;12 long long dfs(int cur, int p)13 14 if (cur = n) return 1;15 else16 17 if (dpcurp = 0)return dpcurp;18 long long t = 0;19 for (int i = 1; i n m;32 for (

22、int i = 0; i t1 t2;36 fuckt1t2 = 1;37 fuckt2t1 = 1;38 39 for (int i = 1; i 7; i+)40 41 ans+=dfs(1, i);42 ans %= N;43 44 for (int i = 0; i n; i+)45 46 ans *= 4;47 ans %= N;48 49 cout ans endl;50 return 0;51 考场程序,数据不够大所以要扣分,最大只能到10【AC版本】:矩阵快速幂同理我们只考虑底面的情况,最后乘上4n即可。我们设六阶矩阵An,其中An的第a行第b列表示第一层底面数字为a、第n层数

23、字为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 N 1007 4 using namespace std; 5 6 struct Matrix 7 8 long long a66; 9 Ma

24、trix(int x)10 11 memset(a, 0, sizeof(a);12 for (int i = 0; i 6; i+) aii = x;13 14 ;15 16 Matrix operator*(const Matrix& p, const Matrix& q) 17 18 Matrix ret(0);19 for (int i = 0; i 6; i+)20 for (int j = 0; j 6; j+)21 for (int k = 0; k = 1;37 38 return ret;39 40 41 int main()42 43 Matrix z(0);44 for

25、(int i = 0; i 6; i+) 45 for (int j = 0; j n m; 51 for (int i = 0; i t1 t2;55 z.at1 - 1(t2 + 2) % 6 = 0;56 z.at2 - 1(t1 + 2) % 6 = 0;57 58 Matrix ret(0);59 ret = fast_mod(z, n - 1);60 long long ans = 0;61 for (int i = 0; i 6; i+)62 63 for (int j = 0; j = 1;80 81 cout ans endl;82 return 0;83 矩阵快速幂第十题

26、程序设计 31生命之树在X森林里,上帝创建了生命之树。他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值。上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都存在一个点列 a, v1, v2, ., vk, b 使得这个点列中的每个点都是S里面的元素,且序列中相邻两个点间有一条边相连。在这个前提下,上帝要使得S中的点所对应的整数的和尽量大。这个最大的和就是上帝给生命之树的评分。经过atm的努力,他已经知道了上帝给每棵树上每个节点上的整数。但是由于 atm 不擅长计算,他不知道怎样有效的求评分。他需要你为他写一个程序来计算一棵树的分数。输入格式第

27、一行一个整数 n 表示这棵树有 n 个节点。第二行 n 个整数,依次表示每个节点的评分。接下来 n-1 行,每行 2 个整数 u, v,表示存在一条 u 到 v 的边。由于这是一棵树,所以是不存在环的。输出格式输出一行一个数,表示上帝给这棵树的分数。样例输入51 -2 -3 4 54 23 11 22 5样例输出8数据范围对于 30% 的数据,n = 10对于 100% 的数据,0 n = 105, 每个节点的评分的绝对值不超过 106 。资源约定:峰值内存消耗 256MCPU消耗 3ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入.” 的多余内容。所有代码放在同一个源文件中,调试通过

28、后,拷贝提交该源码。注意: main函数需要返回0注意: 只使用ANSI C/ANSI C+ 标准,不要调用依赖于编译环境或操作系统的特殊函数。注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。-题解:没有系统的学过树和图,不知道什么方法,我精通的只有floyd,所以考场上只想去骗30%的数据。n最大就是10,考场的时候我直接穷举了点集的所有子集,最多就是1024种情况,判断是否连通,连通的话算出来,可惜时间不够差了一点。所以拿了0分【考场程序】详解:二进制法子集生成穷举给定n,用二进制法做出集合0,1,2,

29、.,n-1的2n-1个非空子集,然后去判断每个子集是否是连通树的一部分,权值再求和即可。 1 /#define DEBUG 2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int maxn = 105; 8 int n; 9 int vermaxn;10 bool arcmaxnmaxn;11 vector vv;12 long long ans = -1007;13 14 void subset(int s)15 16 vv.clear();17 for (int i = 0; i n; i+)18 19 i

30、f (s&(1 i) vv.push_back(i);20 21 22 int len = vv.size(), t = 0;23 for (int i = 0; i len; i+)24 25 for (int j = 0; j len; j+)26 27 if (arcvvivvj)t+;28 29 30 if (t / 2 != len - 1)return;31 32 long long sum = 0;33 for (int i = 0; i ans)ans = sum;35 36 37 int main()38 39 #ifdef DEBUG40 #pragma warning(d

31、isable:4996)41 freopen(d:input.txt, r, stdin);42 /freopen(d:output.txt, w, stdout);43 #endif44 memset(ver, 0, sizeof(ver);45 memset(arc, 0, sizeof(arc);46 cin n;47 for (int i = 0; i veri;50 51 for (int i = 0; i temp1 temp2;55 arctemp1 - 1temp2 - 1 = true;56 arctemp2 - 1temp1 - 1 = true;57 58 for (in

32、t i = 1; i (1n); i+)59 60 subset(i);61 62 cout ans endl;63 return 0;64 考场程序,n只要20出头就爆炸了,只能拿30%多的分数【AC版本(二叉链表)】树形dp详解:题目给出的树是邻接表的构造法,这里用二叉链表表示二叉树,因此需要用dfs求出这棵树的扩展前序遍历来构造树。树建立完成后,用经典的树形dp求出答案即可。 1 /#define DEBUG 2 #include 3 #include 4 #include 5 using namespace std; 6 7 const int maxn = 105; 8 vector

33、 preorder; 9 int pre = 0; 10 int valuemaxn; 11 vector arcmaxn; 12 13 void build() 14 15 int num; 16 cin num; 17 for (int i = 0; i valuei; 20 21 int temp1, temp2; 22 for (int i = 1; i temp1 temp2; 25 arc-temp1.push_back(-temp2); 26 arctemp2.push_back(temp1); 27 28 29 30 void dfs_preorder(int root, in

34、t last) 31 32 preorder.push_back(root); 33 int len = arcroot.size(); 34 for (int i = 0; i len; i+) 35 36 if (arcrooti = last)continue; 37 dfs_preorder(arcrooti, root); 38 39 if (root = last) len+; 40 for (int i = len; i left = creat(bt-left); 62 bt-right = creat(bt-right); 63 64 return bt; 65 66 67

35、/递归求一个结点到另一个结点的路径上的最大和 68 class Solution 69 70 public: 71 long long tmp; 72 int maxPathSum(TreeNode *root) 73 /如果没有子树则最大值就是自己 74 if (root = NULL) 75 /结点空返回 76 return 0; 77 78 tmp = root-val; /tmp存放结点路径数值 79 MaxSubTree(root); /递归 80 return tmp; 81 82 83 int MaxSubTree(TreeNode* subtree) 84 /求解子树 85 l

36、ong long root = subtree-val; /递归时将根结点放在子树的第一个结点上 86 long long left = 0, right = 0; /左右两个递归子树的sum均初始为0 87 if (subtree-left != NULL) 88 /当结点不为空时 89 left = MaxSubTree(subtree-left); /继续递归 90 tmp = tmp left ? tmp : left; 91 92 if (subtree-right != NULL) 93 /同上 94 right = MaxSubTree(subtree-right); 95 tm

37、p = tmp right ? tmp : right; 96 97 long long Lsum = root + left; /递归至空时,将左子树和结点相加作为左边总和 98 long long Rsum = root + right; /右边总和 99 long long SUM = root + left + right; /总和100 long long MaxTmp = max(max(max(Lsum, Rsum), SUM), root); /考虑负数的情况101 tmp = max(tmp, MaxTmp);102 return MaxTmp;103 104 ;105 106 int ma

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论