蓝桥杯初赛b组试题.docx

上传人:b****5 文档编号:11944340 上传时间:2023-04-16 格式:DOCX 页数:34 大小:31.66KB
下载 相关 举报
蓝桥杯初赛b组试题.docx_第1页
第1页 / 共34页
蓝桥杯初赛b组试题.docx_第2页
第2页 / 共34页
蓝桥杯初赛b组试题.docx_第3页
第3页 / 共34页
蓝桥杯初赛b组试题.docx_第4页
第4页 / 共34页
蓝桥杯初赛b组试题.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

蓝桥杯初赛b组试题.docx

《蓝桥杯初赛b组试题.docx》由会员分享,可在线阅读,更多相关《蓝桥杯初赛b组试题.docx(34页珍藏版)》请在冰豆网上搜索。

蓝桥杯初赛b组试题.docx

蓝桥杯初赛b组试题

蓝桥杯初赛b组试题

 

 

————————————————————————————————作者:

————————————————————————————————日期:

 

第一题结果填空3‘

奖券数目

有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。

虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。

某抽奖活动的奖券号码是5位数(10-99),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。

请提交该数字(一个整数),不要写任何多余的内容或说明性文字。

-

题解:

考试的时候写了个回溯法,然后屁颠屁颠的开始做下面一题了。

结果错了→_→

1#include

2usingnamespacestd;

3boolfuck(intt)

4{

5while(t)

6{

7if(t%10==4)returnfalse;

8t/=10;

9}

10returntrue;

11}

12intmain()

13{

14intans=0,t=10;

15while(t<100)

16if(fuck(t++))ans++;

17cout<

18return0;

19}

第一题

正确答案:

52488(我居然上来第一题就错了居然写了13440→_→)

//cout<<8*9*9*9*9;→_→

 

第二题结果填空5‘

星系炸弹

在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。

每个炸弹都可以设定多少天之后爆炸。

比如:

阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。

有一个贝塔炸弹,2014年11月9日放置,定时为1天,请你计算它爆炸的准确日期。

请填写该日期,格式为yyyy-mm-dd即4位年份2位月份2位日期。

比如:

2015-02-19

请严格按照格式书写。

不能出现其它文字或符号。

-

题解:

不用废话,直接手算顶多3分钟,注意2016是闰年

正确答案:

2017-08-05

 

第三题结果填空9‘

三羊献瑞

观察下面的加法算式:

   祥瑞生辉

+ 三羊献瑞

-

 三羊生瑞气

(如果有对齐问题,可以参看【图1.jpg】)

其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。

请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。

-

题解:

水题,给“祥瑞生辉三羊献气”编号01234567,直接回溯穷举即可

1#include

2usingnamespacestd;

3inta[8];

4boolb[10];

5voiddfs(intcur)

6{

7if(cur==8)

8{

9intx=a[0]*1+a[1]*100+a[2]*10+a[3],y=a[4]*1+a[5]*100+a[6]*10+a[1],z=a[4]*10+a[5]*1+a[2]*100+a[1]*10+a[7];

10if(x+y==z)cout<

11}

12else

13{

14for(inti=0;i<10;i++)

15{

16if(cur==0&&i==0)continue;

17if(cur==4&&i==0)continue;

18if(!

b[i])

19{

20b[i]=1;

21a[cur]=i;

22dfs(cur+1);

23b[i]=0;

24}

25}

26}

27}

28intmain()

29{

30dfs(0);

31return0;

32}

第三题

正确答案:

1085

 

第四题代码填空 11‘

格子中输出

StringInGrid函数会在一个指定大小的格子中打印指定的字符串。

要求字符串在水平、垂直两个方向上都居中。

如果字符串太长,就截断。

如果不能恰好居中,可以稍稍偏左或者偏上一点。

下面的程序实现这个逻辑,请填写划线部分缺少的代码。

1#include

2#include

3

4voidStringInGrid(intwidth,intheight,constchar*s)

5{

6inti,k;

7charbuf[1];

8strcpy(buf,s);

9if(strlen(s)>width-2)buf[width-2]=0;

10

11printf("+");

12for(i=0;i

13printf("+\n");

14

15for(k=1;k<(height-1)/2;k++)

16{

17printf("");

18for(i=0;i

19printf("\n");

20}

21

22printf("");

23

24printf("%*s%s%*s",_____________________________________________);//填空

25

26printf("\n");

27

28for(k=(height-1)/2+1;k

29{

30printf("");

31for(i=0;i

32printf("\n");

33}

34

35printf("+");

36for(i=0;i

37printf("+\n");

38}

39

40intmain()

41{

42StringInGrid(20,6,"abcd1234");

43return0;

44}

 

对于题目中数据,应该输出:

++

            

  abcd1234  

            

            

++

(如果出现对齐问题,参看【图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,如何组法?

下面的程序实现了该功能,请填写划线部分缺失的代码。

1#include

2

3voidtest(intx[])

4{

5inta=x[0]*1+x[1]*100+x[2]*10+x[3];

6intb=x[4]*10+x[5]*1+x[6]*100+x[7]*10+x[8];

7

8if(a*3==b)printf("%d/%d\n",a,b);

9}

10

11voidf(intx[],intk)

12{

13inti,t;

14if(k>=9)

15{

16test(x);

17return;

18}

19

20for(i=k;i<9;i++)

21{

22{t=x[k];x[k]=x[i];x[i]=t;}

23f(x,k+1);

24_____________________________________________//填空处

25}

26}

27

28intmain()

29{

30intx[]={1,2,3,4,5,6,7,8,9};

31f(x,0);

32return0;

33}

注意:

只填写缺少的内容,不要书写任何题面已有代码或说明性文字。

 -

题解:

水题,回溯法的最最基本常识,全局变量回溯完成后必须更改回初值

正确答案:

{t=x[k];x[k]=x[i];x[i]=t;}

备注:

1.答案可以形式多样性,只要代入使得代码成立即可

2.我个人认为一个横线可以填多个语句,所以去掉大括号,或者利用原有t值少写一句子noproblem

 

第六题结果填空 17‘

加法变乘法

我们都知道:

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;i<47;i++)

6for(intj=i+2;j<49;j++)

7{

8intsum=0;

9for(intk=1;k

10sum+=i*(i+1);

11for(intk=i+2;k

12sum+=j*(j+1);

13for(intk=j+2;k<50;k++)sum+=k;

14if(sum==2015)cout<

15}

16return0;

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即可。

回溯穷举再剪枝即可。

1#include

2usingnamespacestd;

3intans=0,sum=0;

4voiddfs(intcur)

5{

6if(sum>13)return;

7if(cur==13)

8{

9if(sum==13)ans++;

10return;

11}

12else

13{

14for(inti=0;i<5;i++)

15{

16sum+=i;

17dfs(cur+1);

18sum-=i;

19}

20}

21}

22intmain()

23{

24dfs(0);

25cout<

26return0;

27}

第七题

正确答案:

3598180

 

 

第八题程序设计15‘

移动距离

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。

其楼房的编号为1,2,3...

当排满一行时,从下一行相邻的楼往反方向排号。

比如:

当小区排号宽度为6时,开始情形如下:

1 2 3 456

121110 987

131415.....

我们的问题是:

已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)

输入为3个整数wmn,空格分开,都在1到10范围内

w为排号宽度,m,n为待计算的楼号。

要求输出一个整数,表示mn两楼间最短移动距离。

例如:

用户输入:

682

则,程序应该输出:

4

再例如:

用户输入:

4720

则,程序应该输出:

5

资源约定:

峰值内存消耗<256M

CPU消耗<1ms

请严格按要求输出,不要画蛇添足地打印类似:

“请您输入...”的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意:

main函数需要返回0

注意:

只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。

注意:

所有依赖的函数必须明确地在源文件中#include,不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

-

题解:

从分值上都能看出来是水题。

比前面两个填空题的分值都低。

最简单的做法,小学生都会的,用数论的完全剩余系,我们强行更改矩阵的编号

比如题目中的强行更改为:

0 1 2 3 4 5  

1110 9 8 7 6

121314......

这样就算起来非常方便了,要求的答案就是坐标之差

#include

#include

usingnamespacestd;

intmain()

{

intw,m,n;

cin>>w>>m>>n;

m--;n--;

intm1=m/w,m2=m%w;

if(m1&1)m2=w-1-m2;

intn1=n/w,n2=n%w;

if(n1&1)n2=w-1-n2;

cout<

return0;

}

第八题

 

 

第九题 程序设计25‘

垒骰子

赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。

经过长期观察,atm发现了稳定骰子的奥秘:

有些数字的面贴着会互相排斥!

我们先来规范一下骰子:

1的对面是4,2的对面是5,3的对面是6。

假设有m组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。

 

atm想计算一下有多少种不同的可能的垒骰子方式。

两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。

由于方案数可能过多,请输出模10^9+7的结果。

不要小看了atm的骰子数量哦~

「输入格式」

第一行两个整数nm

n表示骰子数目

接下来m行,每行两个整数ab,表示a和b数字不能紧贴在一起。

「输出格式」

一行一个数,表示答案模10^9+7的结果。

「样例输入」

21

12

「样例输出」

544

「数据范围」

对于30%的数据:

n<=5

对于60%的数据:

n<=100

对于100%的数据:

0

资源约定:

峰值内存消耗<256M

CPU消耗<2ms

请严格按要求输出,不要画蛇添足地打印类似:

“请您输入...”的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意:

main函数需要返回0

注意:

只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。

注意:

所有依赖的函数必须明确地在源文件中#include,不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

-

题解:

终于不是水题了,然而却没全做出来。

难度跳跃太大。

考场上,我先用dfs做,结果数字大于5的时间就hold不住了,于是果断改成记忆化动态规划,但是只能到一万,实在没办法了。

大神跟我说用矩阵快速幂做,所以现在立马现学现用。

程序有空补。

 【考场程序】讲解:

利用记忆化DP穷举底面衔接的所有情况,dp[p][q]表示第p层底面是q的情况种数,侧面是相互独立的最后乘以4^n即可比如提给数据就是34再乘上两个4。

但是上限1实在是达不到了。

1#include

2#include

3#defineN1007

4usingnamespacestd;

5//考场上我用的map现在想想发现多余了

6into[7]={0,4,5,6,1,2,3};

7boolfuck[7][7];

8intn,m;

9longlongans=0;

10constintmaxn=25;

11longlongdp[maxn][7];

12longlongdfs(intcur,intp)

13{

14if(cur==n)return1;

15else

16{

17if(dp[cur][p]>=0)returndp[cur][p];

18longlongt=0;

19for(inti=1;i<7;i++)

20{

21if(fuck[i][o[p]])continue;

22t+=dfs(cur+1,i);

23t%=N;

24}

25returndp[cur][p]=t;

26}

27}

28intmain()

29{

30memset(dp,-1,sizeof(dp));

31cin>>n>>m;

32for(inti=0;i

33{

34intt1,t2;

35cin>>t1>>t2;

36fuck[t1][t2]=1;

37fuck[t2][t1]=1;

38}

39for(inti=1;i<7;i++)

40{

41ans+=dfs(1,i);

42ans%=N;

43}

44for(inti=0;i

45{

46ans*=4;

47ans%=N;

48}

49cout<

50return0;

51}

考场程序,数据不够大所以要扣分,最大只能到10

【AC版本】:

矩阵快速幂

同理我们只考虑底面的情况,最后乘上4^n即可。

我们设六阶矩阵An,其中An的第a行第b列表示第一层底面数字为a、第n层数字为b的所有排列的情况

记六阶矩阵X中,第a行第b列表示相邻两层的是否能成功连接的情况。

a和b能连则为1,a和b不能连则为0(注意是相邻两层的底面,不是衔接面,所以要转化,比如题给的12要改为15)

根据上述定义,易得递推式:

An =An-1X,且A1 =E(六阶单位矩阵)

可得到An的表达式为An =Xn-1

那么ans就是矩阵 Xn-1 的36个元素之和

注意最后侧面的4^n也要二分幂不然会爆炸

1#include

2#include

3#defineN1007

4usingnamespacestd;

5

6structMatrix

7{

8longlonga[6][6];

9Matrix(intx)

10{

11memset(a,0,sizeof(a));

12for(inti=0;i<6;i++)a[i][i]=x;

13}

14};

15

16Matrixoperator*(constMatrix&p,constMatrix&q)

17{

18Matrixret(0);

19for(inti=0;i<6;i++)

20for(intj=0;j<6;j++)

21for(intk=0;k<6;k++)

22{

23ret.a[i][j]+=p.a[i][k]*q.a[k][j];

24ret.a[i][j]%=N;

25}

26returnret;

27}

28

29Matrixfast_mod(Matrixx,intt)

30{

31Matrixret

(1);

32while(t)

33{

34if(t&1)ret=x*ret;

35x=x*x;

36t>>=1;

37}

38returnret;

39}

40

41intmain()

42{

43Matrixz(0);

44for(inti=0;i<6;i++)

45for(intj=0;j<6;j++)

46{

47z.a[i][j]=1;

48}

49intm,n;

50cin>>n>>m;

51for(inti=0;i

52{

53intt1,t2;

54cin>>t1>>t2;

55z.a[t1-1][(t2+2)%6]=0;

56z.a[t2-1][(t1+2)%6]=0;

57}

58Matrixret(0);

59ret=fast_mod(z,n-1);

60longlongans=0;

61for(inti=0;i<6;i++)

62{

63for(intj=0;j<6;j++)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1