蓝桥杯cc++省赛试题卷与答案.docx

上传人:b****3 文档编号:10262472 上传时间:2023-05-24 格式:DOCX 页数:28 大小:63.43KB
下载 相关 举报
蓝桥杯cc++省赛试题卷与答案.docx_第1页
第1页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第2页
第2页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第3页
第3页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第4页
第4页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第5页
第5页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第6页
第6页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第7页
第7页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第8页
第8页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第9页
第9页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第10页
第10页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第11页
第11页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第12页
第12页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第13页
第13页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第14页
第14页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第15页
第15页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第16页
第16页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第17页
第17页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第18页
第18页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第19页
第19页 / 共28页
蓝桥杯cc++省赛试题卷与答案.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

蓝桥杯cc++省赛试题卷与答案.docx

《蓝桥杯cc++省赛试题卷与答案.docx》由会员分享,可在线阅读,更多相关《蓝桥杯cc++省赛试题卷与答案.docx(28页珍藏版)》请在冰点文库上搜索。

蓝桥杯cc++省赛试题卷与答案.docx

蓝桥杯cc++省赛试题卷与答案

2016蓝桥杯c-c++B组省赛试题及解析

第一题

煤球数目

有一堆煤球,堆成三角棱锥形。

具体:

第一层放1个,

第二层3个(排列成三角形),

第三层6个(排列成三角形),

第四层10个(排列成三角形),

....

如果一共有100层,共有多少个煤球?

请填表示煤球总数目的数字。

注意:

你提交的应该是一个整数,不要填写任何多余的容或说明性文字。

答案:

171700

#include

intmain()

{

inta[101]={0};

for(inti=1;i<101;i++)

a[i]=a[i-1]+i;

intans=0;

for(intj=1;j<101;j++)

ans+=a[j];

printf("%d\n",ans);

return0;

}

 

第二题

生日蜡烛

某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。

现在算起来,他一共吹熄了236根蜡烛。

请问,他从多少岁开始过生日party的?

请填写他开始过生日party的年龄数。

注意:

你提交的应该是一个整数,不要填写任何多余的容或说明性文字。

答案:

26

#include

intmain()

{

intstart,end;

for(start=1;start<236;start++)

{

for(end=start;end<236;end++)

{

intsum=0;

for(inti=start;i<=end;i++)

sum+=i;

if(sum==236)

{

printf("start:

%dend:

%d\n",start,end);

}

}

}

return0;

}

第三题

凑算式

BDEF

A+---+-------=10

CGHI

(如果显示有问题,可以参见【图1.jpg】)

这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:

6+8/3+952/714就是一种解法,

5+3/1+972/486是另一种解法。

这个算式一共有多少种解法?

注意:

你提交应该是个整数,不要填写任何多余的容或说明性文字。

答案:

29

#include

intans=0;

intnum[10];

boolvisit[10];

voidSolve()

{

doublesum=num[0]+(double)num[1]/num[2]+(double)(num[3]*100+num[4]*10+num[5])/(num[6]*100+num[7]*10+num[8]);

if(sum==10)

{

ans++;

}

}

voiddfs(intindex)

{

if(index==9)

{

Solve();

return;

}

for(inti=1;i<10;i++)

{

if(!

visit[i])

{

visit[i]=true;

num[index]=i;

dfs(index+1);

visit[i]=false;

}

}

}

intmain()

{

dfs(0);

printf("%d\n",ans);

return0;

}

第四题

快速排序

排序在各种场合经常被用到。

快速排序是十分常用的高效率的算法。

其思想是:

先选一个“标尺”,

用它把整个队列过一遍筛子,

以保证:

其左边的元素都不大于它,其右边的元素都不小于它。

这样,排序问题就被分割为两个子区间。

再分别对子区间排序就可以了。

下面的代码是一种实现,请分析并填写划线部分缺少的代码。

 

#include

voidswap(inta[],inti,intj)

{

intt=a[i];

a[i]=a[j];

a[j]=t;

}

intpartition(inta[],intp,intr)

{

inti=p;

intj=r+1;

intx=a[p];

while

(1){

while(i

while(a[--j]>x);

if(i>=j)break;

swap(a,i,j);

}

______________________;

returnj;

}

voidquicksort(inta[],intp,intr)

{

if(p

intq=partition(a,p,r);

quicksort(a,p,q-1);

quicksort(a,q+1,r);

}

}

intmain()

{

inti;

inta[]={5,13,6,24,2,8,19,27,6,12,1,17};

intN=12;

quicksort(a,0,N-1);

for(i=0;i

printf("\n");

return0;

}

 

注意:

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

答案:

swap(a,p,j)

第五题

抽签

X星球要派出一个5人组成的观察团前往W星。

其中:

A国最多可以派出4人。

B国最多可以派出2人。

C国最多可以派出2人。

....

那么最终派往W星的观察团会有多少种国别的不同组合呢?

下面的程序解决了这个问题。

数组a[]中既是每个国家可以派出的最多的名额。

程序执行结果为:

DEFFF

CEFFF

CDFFF

CDEFF

CCFFF

CCEFF

CCDFF

CCDEF

BEFFF

BDFFF

BDEFF

BCFFF

BCEFF

BCDFF

BCDEF

....

(以下省略,总共101行)

 

#include

#defineN6

#defineM5

#defineBUF1024

voidf(inta[],intk,intm,charb[])

{

inti,j;

if(k==N){

b[M]=0;

if(m==0)printf("%s\n",b);

return;

}

for(i=0;i<=a[k];i++){

for(j=0;j

______________________;//填空位置

}

}

intmain()

{

inta[N]={4,2,2,1,1,3};

charb[BUF];

f(a,0,M,b);

return0;

}

仔细阅读代码,填写划线部分缺少的容。

注意:

不要填写任何已有容或说明性文字。

答案f(a,k+1,m-j,b)或f(a,k+1,m-i,b)

第六题

方格填数

如下的10个格子

+--+--+--+

||||

+--+--+--+--+

|||||

+--+--+--+--+

||||

+--+--+--+

 

(如果显示有问题,也可以参看【图1.jpg】)

填入0~9的数字。

要求:

连续的两个数字不能相邻。

(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。

注意:

你提交的应该是一个整数,不要填写任何多余的容或说明性文字。

图1.jpg

 

答案是:

1580

#include

#include

intflag[3][4];//表示哪些可以填数

intmpt[3][4];//填数

boolvisit[10];

intans=0;

voidinit()//初始化

{

inti,j;

for(i=0;i<3;i++)

for(j=0;j<4;j++)

flag[i][j]=1;

flag[0][0]=0;

flag[2][3]=0;

}

voidSolve()

{

intdir[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};

intbook=true;

for(inti=0;i<3;i++)

{

for(intj=0;j<4;j++)

{

//判断每个数周围是否满足

if(flag[i][j]==0)continue;

for(intk=0;k<8;k++)

{

intx,y;

x=i+dir[k][0];

y=j+dir[k][1];

if(x<0||x>=3||y<0||y>=4||flag[x][y]==0)continue;

if(abs(mpt[x][y]-mpt[i][j])==1)book=false;

}

}

}

if(book)ans++;

}

 

voiddfs(intindex)

{

intx,y;

x=index/4;

y=index%4;

if(x==3)

{

Solve();

return;

}

if(flag[x][y])

{

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

{

if(!

visit[i])

{

visit[i]=true;

mpt[x][y]=i;

dfs(index+1);

visit[i]=false;

}

}

}

else

{

dfs(index+1);

}

}

intmain()

{

init();

dfs(0);

printf("%d\n",ans);

return0;

}

第七题

剪邮票

如【图1.jpg】,有12连在一起的12生肖的邮票。

现在你要从中剪下5来,要求必须是连着的。

(仅仅连接一个角不算相连)

比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。

请你计算,一共有多少种不同的剪取方法。

请填写表示方案数目的整数。

注意:

你提交的应该是一个整数,不要填写任何多余的容或说明性文字。

 

答案:

116

#include

#include

intmpt[3][4];

intmpt_visit[3][4];

intnum[6];

inthave[13];

intvisit[13];

intans=0;

intCount=0;

voidinit()

{

intk=1;

for(inti=0;i<3;i++)

for(intj=0;j<4;j++)

{

mpt[i][j]=k;

k++;

}

}

intdir[4][2]={0,1,0,-1,-1,0,1,0};

//判断五个数是否能连在一起

voiddfs_find(intx,inty)

{

for(inti=0;i<4;i++)

{

inttx,ty;

tx=x+dir[i][0];

ty=y+dir[i][1];

if(tx<0||tx>=3||ty<0||ty>=4)continue;

if(have[mpt[tx][ty]]==0||mpt_visit[tx][ty])continue;

mpt_visit[tx][ty]=1;

Count++;

dfs_find(tx,ty);

}

}

voidSolve()

{

inti;

memset(have,0,sizeof(have));

memset(mpt_visit,0,sizeof(mpt_visit));

for(i=1;i<6;i++)have[num[i]]=1;

for(i=0;i<12;i++)

{

intx,y;

x=i/4;

y=i%4;

if(have[mpt[x][y]])

{

Count=1;

mpt_visit[x][y]=1;

dfs_find(x,y);

break;

}

}

if(Count==5)

{

ans++;

}

}

//创建5个数的组合

voiddfs_creat(intindex)

{

if(index==6)

{

Solve();

return;

}

for(inti=num[index-1]+1;i<13;i++)

{

if(!

visit[i])

{

visit[i]=true;

num[index]=i;

dfs_creat(index+1);

visit[i]=false;

}

}

}

intmain()

{

init();

dfs_creat

(1);

printf("%d\n",ans);

return0;

}

第八题

方和

方和定理,又称为拉格朗日定理:

每个正整数都可以表示为至多4个正整数的平方和。

如果把0包括进去,就正好可以表示为4个数的平方和。

比如:

5=0^2+0^2+1^2+2^2

7=1^2+1^2+1^2+2^2

(^符号表示乘方的意思)

对于一个给定的正整数,可能存在多种平方和的表示法。

要求你对4个数排序:

0<=a<=b<=c<=d

并对所有的可能表示法按a,b,c,d为联合主键升序排列,最后输出第一个表示法

 

程序输入为一个正整数N(N<5000000)

要求输出4个非负整数,按从小到大排序,中间用空格分开

例如,输入:

5

则程序应该输出:

0012

再例如,输入:

12

则程序应该输出:

0222

再例如,输入:

773535

则程序应该输出:

11267838

资源约定:

峰值存消耗<256M

CPU消耗<3000ms

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

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

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

注意:

main函数需要返回0

注意:

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

注意:

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

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

答案:

方法一:

#include

#include

intmain()

{

intn;

intflag=false;

scanf("%d",&n);

for(inti=0;i*i<=n;i++)

{

for(intj=0;j*j<=n;j++){

for(intk=0;k*k<=n;k++)

{

inttemp=n-i*i-j*j-k*k;

doublel=sqrt((double)temp);

if(l==(int)l)

{

printf("%d%d%d%d\n",i,j,k,(int)l);

flag=true;

break;

}

}

if(flag)break;

}

if(flag)break;

}

return0;

}

方法二:

#include

#include

intmpt[5000010]={0};//mpt[i]=1表示i能够用两个完全平方数相加而得。

intn;

voidinit()

{

for(inti=0;i*i<=n;i++)

for(intj=0;j*j<=n;j++)

if(i*i+j*j<=n)mpt[i*i+j*j]=1;

}

intmain()

{

intflag=false;

scanf("%d",&n);

init();

for(inti=0;i*i<=n;i++)

{

for(intj=0;j*j<=n;j++){

if(mpt[n-i*i-j*j]==0)continue;//如果剩下的差用两个完全平方数不能组合出来就不继续

for(intk=0;k*k<=n;k++)

{

inttemp=n-i*i-j*j-k*k;

doublel=sqrt((double)temp);

if(l==(int)l)

{

printf("%d%d%d%d\n",i,j,k,(int)l);

flag=true;

break;

}

}

if(flag)break;

}

if(flag)break;

}

return0;

}

第九题

交换瓶子

有N个瓶子,编号1~N,放在架子上。

比如有5个瓶子:

21354

要求每次拿起2个瓶子,交换它们的位置。

经过若干次后,使得瓶子的序号为:

12345

对于这么简单的情况,显然,至少需要交换2次就可以复位。

如果瓶子更多呢?

你可以通过编程来解决。

输入格式为两行:

第一行:

一个正整数N(N<10000),表示瓶子的数目

第二行:

N个正整数,用空格分开,表示瓶子目前的排列情况。

输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。

例如,输入:

5

31254

程序应该输出:

3

再例如,输入:

5

54321

程序应该输出:

2

资源约定:

峰值存消耗<256M

CPU消耗<1000ms

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

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

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

注意:

main函数需要返回0

注意:

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

注意:

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

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

 

第十题

最大比例

X星球的某个大奖赛设了M级奖励。

每个级别的奖金是一个正整数。

并且,相邻的两个级别间的比例是个固定值。

也就是说:

所有级别的奖金数构成了一个等比数列。

比如:

16,24,36,54

其等比值为:

3/2

现在,我们随机调查了一些获奖者的奖金数。

请你据此推算可能的最大的等比值。

输入格式:

第一行为数字N(0

第二行N个正整数Xi(Xi<1000000000000),用空格分开。

每个整数表示调查到的某人的奖金数额

要求输出:

一个形如A/B的分数,要求A、B互质。

表示可能的最大比例系数

测试数据保证了输入格式正确,并且最大比例是存在的。

例如,输入:

3

125020032

程序应该输出:

25/4

再例如,输入:

4

31253232200

程序应该输出:

5/2

再例如,输入:

3

5497558138885242882

程序应该输出:

4/1

资源约定:

峰值存消耗<256M

CPU消耗<3000ms

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

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

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

注意:

main函数需要返回0

注意:

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

注意:

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

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

答案:

#include

#include

#include

usingnamespacestd;

#defineLLlonglong

structfs

{

LLup,down;

};

intn;

LLarr[110];

fsFs[110];

boolcmp(LLa,LLb)

{

returna>b;

}

LLGcd(LLa,LLb)

{

if(b==0)returna;

returnGcd(b,a%b);

}

LLGet(LLa,LLb)

{

if(a

LLv[30];

queueteam;

if(a==b||a/b==a)returnb;

v[0]=a,v[1]=b;

v[2]=a/b;

inttop=3,i,j;

team

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

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2