第五届蓝桥杯预赛题目及答案

巡山小妖精
827次浏览
2021年02月12日 21:50
最佳经验
本文由作者推荐

-

2021年2月12日发(作者:一个人的天长地久)


2014


年第五届蓝桥杯预赛题目



第一题



标题:啤酒和饮料








啤酒每罐


2.3


元,饮料每罐


1.9


元。小明买了若干啤酒和饮料,一共花了


82 .3


元。








我们还 知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。








注意:答案是一个整数。请通过浏览器提交答案。




不要书写任何多余的内容(例如:写了饮料的数量,添加说明 文字等)





#include


using namespace std;


int main()


{



for(int i = 1; i * 2.3 <= 82.3; i++)




for(int j = i + 1; i * 2.3 + j * 1.9 <= 82.3; j++)




{





if(i * 2.3 + j * 1.9 >= 82.3 - 0.000001 && i * 2.3 + j * 1.9 <= 82.3 + 0.000001)






printf(




}



return 0;


}



第二题




标题:切面条








一根高筋拉面,中间切一刀,可以得到


2


根面条。








如果先对折


1


次,中间切一刀,可以得到< /p>


3


根面条。








如果连续对折


2


次,中间切一刀,可以得到


5


根面条。








那么,连续对折


10


次,中间切一刀,会得 到多少面条呢?




答案是个整数,请 通过浏览器提交答案。不要填写任何多余的内容。



F(n)=2f(n-1)-1












2


#include


using namespace std;


int main()


{



int num = 2;



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



{




num = num * 2 - 1;




printf(



}



return 0;


}



标题:蚂蚁感冒









100


厘 米的细长直杆子上有


n


只蚂蚁。它们的头有的朝左,有的朝右。









每只蚂 蚁都只能沿着杆子向前爬,速度是


1


厘米


/


秒。








当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。








这些蚂蚁中,有


1

< br>只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。








请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感 冒。



【数据格式】







第一行输入一个整数


n (1 < n < 50),


表示蚂蚁的总数。







接着的 一行是


n


个用空格分开的整数



Xi (-100 < Xi < 100), Xi


的绝对值 ,表示蚂蚁离开杆子左边


端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出 现


0


值,也不会出现两只蚂蚁占用同


一 位置。其中,第一个数据代表的蚂蚁感冒了。







要求输 出


1


个整数,表示最后感冒蚂蚁的数目。



例如,输入:



3


5 -2 8


程序应输出:



1


再例如,输入:



5


-10 8 -20 12 25


程序应输出:



3


资源约定:



峰值内存消耗



< 256M


CPU


消耗




< 1000ms


首先明白两只蚂蚁碰撞之后掉头和穿行过去 是一样的,


可以把穿行看做碰撞后掉头了,


然后两个蚂蚁


交换了,而是哪一只蚂蚁对结果不影响。



那 么,


假如第一只感冒蚂蚁向右走,


那么碰到所有想左走的都会被 感染,


而感染后的蚂蚁必定是向左


走的,那么他会把左边向右走 的都感染了。



向左走的也是这样。



所以



ans =


左边向右走的



+


右边向左走的



+ 1


(本身)




当然还有特殊情况,


第一只感染的向右走,


右边的都在向右走 ,


那么速度一样的话它不会感染其他所


有,所以



ans = 1


,相反也是。




标题:奇怪的分式








上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:








1/4


乘以



8/5








小明居然把分子拼接在一起,分母 拼接在一起,答案是:


18/45


(参见图










老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!








对于分子、分母都是



1~9


中的一位数的情况,还有哪些算式可以这样计算呢?








请写出所有不同算式的个数(包括题中举例的)









显然,交换分子分母后,例如:


4/1


乘以



5/8


是满足要求的,这算做不同的算式。








但对于分子分母相同的情况,


2/2


乘以



3/3


这样的类型太多了,不在计数之列


!



注意:答案是个整数(考虑对称性,肯定是偶数)


。请通过浏览 器提交。不要书写多余的内容。






#include


using namespace std;


int sum = 0;


int main()


{



for(int a = 1; a <= 9; a++)



{




for(int b = 1; b <= 9; b++)




{





for(int c = 1; c <= 9; c++)





{






for(int d = 1; d <= 9; d++)






{







if(a == b && c == d)








continue;







int na = a * 10 + c, nb = b * 10 + d;







if(a * 1.0 / b * c * 1.0 / d >= na * 1.0 / nb - 0.000001 &&









a * 1.0 / b * c * 1.0 / d <= na * 1.0 / nb + 0.000001)







{








printf(








sum++;







}






}





}




}



}



printf(



return 0;


}




第三题




标题:李白打酒








话说大诗人李白,一生好饮。幸好他从不开车。








一天,他提着酒壶,从家里出来,酒壶中有酒


2


斗。他边走边唱:








无事街上走,提壶去打酒。







逢店加一倍,遇花喝一斗。








这一路上,他一共遇到店


5


次,遇到花


10


次,已知最后一次遇到的是花,他正好把酒喝光了。

< p>








请你计 算李白遇到店和花的次序,可以把遇店记为


a


,遇花记为


b


。则:


babaabbabbabbbb


就是


合理的次序。像这样的答案一共有多少呢?请你计算出所有 可能方案的个数(包含题目给出的)









注意:通过浏览器提交答案。答案是个整数。不要书写任何多 余的内容。




第四题




标题:史丰收速算








史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传统手算


!







速算的核心基础是:


1


位数乘以多位数的乘法。








其中,乘以


7


是最复杂的,就以它为例。








因为,


1/7


是个循环小数:


0.142857...


,如果多位数超过



142857...


,就要进


1







同理,


2/7, 3/7, ... 6/7


也都是类似的循环小数,多位数超过



n/7


,就要进


n







下面的程序模拟了史丰收速算法中乘以


7


的运算过程。








乘以



7


的 个位规律是:偶数乘以


2


,奇数乘以


2


再加


5


,都只取个位。








乘以



7


的进位规律是:






142857...



1,





285714...



2,





428571...



3,





571428...



4,





714285...



5,





857142...



6







请分析程序流程,填写划线部分缺少的代码。



2401



//


计算个位




int ge_wei(int a)


{



if(a % 2 == 0)




return (a * 2) % 10;



else




return (a * 2 + 5) % 10;



}



//


计算进位




int jin_wei(char* p)


{



char* level[] = {





















};





char buf[7];



buf[6] = '0';



strncpy(buf,p,6);





int i;



for(i=5; i>=0; i--){




int r = strcmp(level[i], buf);




if(r<0) return i+1;




while(r==0){





p += 6;





strncpy(buf,p,6);





r = strcmp(level[i], buf);





if(r<0) return i+1;





______________________________;



//


填空





}



}



return 0;


}



//


多位数乘以


7


void f(char* s)



{



int head = jin_wei(s);



if(head > 0) printf(





char* p = s;



while(*p){




int a = (*p-'0');




int x = (ge_wei(a) + jin_wei(p+1)) % 10;




printf(




p++;



}





printf(


}



int main()


{



f(



f(





return 0;


}




注意 :通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字)



第五题




标题:打印图形








小明在


X


星 球的城堡中发现了如下图形和文字:



rank=3




rank=5


ran=6







小明开动脑筋,编写了如下的程序,实现该图形的打印。




#define N 70



void f(char a[][N], int rank, int row, int col)


{



if(rank==1){




a[row][col] = '*';




return;



}





int w = 1;



int i;



for(i=0; i





____________________________________________;



f(a, rank-1, row+w/2, col);



f(a, rank-1, row+w/2, col+w);


}



int main()


{



char a[N][N];



int i,j;



for(i=0;i



for(j=0;j



f(a,6,0,0);



for(i=0; i




for(j=0; j




printf(



}



return 0;


}






请仔细分析程序逻辑,填写缺失代码部分。








通过浏览器提交答案。


注意不要填写 题目中已有的代码。


也不要写任何多余内容


(比如说明性的


文字)




第六题




标题:奇怪的分式








上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:








1/4


乘以



8/5








小明居然把分子拼接在一起,分母 拼接在一起,答案是:


18/45


(参见图










老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!








对于分子、分母都是



1~9


中的一位数的情况,还有哪些算式可以这样计算呢?








请写出所有不同算式的个数(包括题中举例的)









显然,交换分子分母后,例如:


4/1


乘以



5/8


是满足要求的,这算做不同的算式。








但对于分子分母相同的情况,


2/2


乘以



3/3


这样的类型太多了,不在计数之列


!



注意:答案是个整数(考虑对称性,肯定是偶数)


。请通过浏览 器提交。不要书写多余的内容。





第七题




标题:六角填数








如图【



】所示六角形中,填入


1~12


的数字。








使得每条直线上的数字之和都相同。








图中,已经替你填好了


3


个数字,请你计算 星号位置所代表的数字是多少?




请通过浏览器提交答案,不要填写多余的内容。




第八题




标题:蚂蚁感冒









100


厘米的细长直杆子上有

< p>
n


只蚂蚁。它们的头有的朝左,有的朝右。









每只蚂蚁都只能沿着杆子向前爬, 速度是


1


厘米


/


秒。








当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。








这些蚂蚁中,有


1

< br>只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。








请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感 冒。



【数据格式】







第一行输入一个整数


n (1 < n < 50),


表示蚂蚁的总数。







接着的 一行是


n


个用空格分开的整数



Xi (-100 < Xi < 100), Xi


的绝对值 ,表示蚂蚁离开杆子左边


端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出 现


0


值,也不会出现两只蚂蚁占用同


一 位置。其中,第一个数据代表的蚂蚁感冒了。







要求输 出


1


个整数,表示最后感冒蚂蚁的数目。



例如,输入:



3


5 -2 8


程序应输出:



1


再例如,输入:



5


-10 8 -20 12 25


程序应输出:



3


资源约定:



峰值内存消耗



< 256M


CPU


消耗




< 1000ms


首先明白两只蚂蚁碰撞之后掉头和穿行过去 是一样的,可以把穿行看做碰撞后掉头了,然后两个蚂蚁交换了,而是


哪一只蚂蚁对结果 不影响。



那么,假如第一只感冒蚂蚁向右走,那么碰到所有想 左走的都会被感染,而感染后的蚂蚁必定是向左走的,那么他


会把左边向右走的都感染了 。



向左走的也是这样。



所以



ans =


左边向右走的



+


右边向左走的



+ 1


(本身)。



当然还有特殊情况,第 一只感染的向右走,右边的都在向右走,那么速度一样的话它不会感染其他所有,所以



ans


= 1


,相反也是。





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


“请您输入


...




的多余内容。



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



注意


: main


函数需要返回


0


注意


:


只使用


ANSI C/ANSI C++


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



注意


:


所有依赖的函数必须明确地在源文件中



#include





不能通过工程设置而省略常用头文


件。



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



第九题



标题:地宫取宝







X


国王有一个地宫宝库。是



n x m


个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标


签。







地宫的入口在左上角,出口在右下角。







小明被带到地宫的入口,国王要求他只能向右或向下行走。







走过某个格子时,


如果那个格子中的宝贝价值比小明手中任意宝贝价 值都大,


小明就可以拿起它


(当然,也可以不拿)








当小明走到出口时,如果他手中的 宝贝恰好是


k


件,则这些宝贝就可以送给小明。







请你帮小明算一算,在给定的局面下,他有多少种不同的行动 方案能获得这


k


件宝贝。



【数据格式】







输入一 行


3


个整数,用空格分开:


n m k (1<=n,m<=50, 1<=k<=12)






接下来有



n


行数据,每行有



m


个整数



Ci (0<=Ci<=12)


代表这个格子上的宝物的价值



要求输出一个整数,


表示正好取


k

< p>
个宝贝的行动方案数。


该数字可能很大,


输出它对



1000000007


取模的结果。



例如,输入:



2 2 2


1 2


2 1


程序应该输出:



2


再例如,输入:



2 3 2


1 2 3


2 1 5


程序应该输出:



14


资源约定:



峰值内存消耗



< 256M


CPU


消耗




< 1000ms


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


“请您输入


...




的多余内容。



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



注意


: main


函数需要返回


0


注意


:


只使用


ANSI C/ANSI C++


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



注意


:


所有依赖的函数必须明确地在源文件中



#include





不能通过工程设置而省略常用头文


件。



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



第十题



标题:小朋友排队







n < /p>


个小朋友站成一排。


现在要把他们按身高从低到高的顺序排列,< /p>


但是每次只能交换位置相邻的


两个小朋友。







每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是


0









如果某个小朋友第一次被要求交换,则他的不高兴程度增加


1


,如果第二次要求他交换,则他的


不高兴程度增加

2


(即不高兴程度为


3



,依次类推。当要求某个小朋友第


k


次交换时, 他的不高兴程


度增加


k




请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少 。







如果有两个小朋友身高一样,则他们谁站在谁前面是没有关系 的。



【数据格式】







输入的第一行包含一个整数


n


,表示小朋友 的个数。







第二行包含



n


个整数



H1 H2




Hn


,分别表示每个小朋友的身高。







输出一行,包含一个整数,表示小朋友的不高兴程度和的最小值。



例如,输入:



3


3 2 1


程序应该输出:



9


【样例说明】






首先交 换身高为


3



2


的小朋友,


再交换身高为


3



1


的小朋友,


再交换身高为

< br>2



1


的小朋友,


每个小朋友的不高兴程度都是


3


,总和为

< p>
9




【数据规模与约定】







对于< /p>


10%


的数据,



1<=n<=10








对于


30%


的数据,



1<=n<=1000








对于


50%


的数据,



1<=n<=10000








对于


100%


的数据,

1<=n<=100000



0<=Hi<=100000 0




资源约定:



峰值内存消耗



< 256M


CPU


消耗




< 1000ms


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


“请您输入


...




的多余内容。



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



注意


: main


函数需要返回


0


注意


:


只使用


ANSI C/ANSI C++


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



注意


:


所有依赖的函数必须明确地在源文件中



#include





不能通过工程设置而省略常用头文


件。



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


























































参考答案



1


#include


using namespace std;


int main()


{



for(int i = 1; i * 2.3 <= 82.3; i++)




for(int j = i + 1; i * 2.3 + j * 1.9 <= 82.3; j++)




{





if(i * 2.3 + j * 1.9 >= 82.3 - 0.000001 && i * 2.3 + j * 1.9 <= 82.3 + 0.000001)






printf(




}



return 0;


}



2


#include


using namespace std;


int main()


{

-


-


-


-


-


-


-


-