2018蓝桥杯试题
蓝桥杯历届c语言试题及答案

蓝桥杯历届c语言试题及答案蓝桥杯历届C语言试题及答案1. 问题描述编写一个程序,实现对给定整数数组进行排序的功能。
2. 输入格式第一行包含一个整数N,表示数组中元素的数量。
第二行包含N个整数,表示数组中的元素。
3. 输出格式输出排序后的数组。
4. 样例输入```53 14 1 5```5. 样例输出```1 1 3 4 5```6. 答案```c#include <stdio.h>#include <stdlib.h>void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}int partition(int arr[], int low, int high) { int pivot = arr[high];int i = (low - 1);for (int j = low; j <= high - 1; j++) {if (arr[j] < pivot) {i++;swap(&arr[i], &arr[j]);}}swap(&arr[i + 1], &arr[high]);return (i + 1);}void quickSort(int arr[], int low, int high) { if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}}int main() {int N;scanf("%d", &N);int arr[N];for (int i = 0; i < N; i++) { scanf("%d", &arr[i]);}quickSort(arr, 0, N - 1);for (int i = 0; i < N; i++) { printf("%d ", arr[i]);}return 0;}```。
蓝桥杯试题标准答案(练习)

1、亲密数:假设有a、b两个数,若 a 的所有因子之和等于b,b 的所有因子之和等于a ,并且 a 不等于b ,则称 a 和 b 是一对亲密数。
如284 和 220 就是一对亲密数。
#include<stdio.h>int main(){int a,b,i,n;for(a=1;a<=10000;a++){for(b=0,i=1;i<=a/2;i++)if(a%i==0)1b+=i;for(n=0,i=1;i<=b/2;i++)if(b%i==0)n+=i;1if(n==a&&a!=b&&a<b)printf("%d-%d\n",a,b);}return 0;}2、世纪末的星期:曾有邪教称 1999 年 12 月 31 日是世界末日。
当然该谣言已经不攻自破。
还有人称今后的某个世纪末的12 月 31 日如果是星期一则会....有趣的是任何一个世纪末的年份的12 月 31 日都不可能是星期一!!于是“谣言制造商”又修改为星期日 ......1999 年的 12 月 31 日是星期五,请问,未来哪一个离我们最近的一个世纪末年即xx99 年的12 月 31 日正好是星期天,即星期日请回答该年份,只写这个4 位整数,不要写 12 月 31 等多余信息#include<stdio.h>2int main(){long days = 5; /*1999 年的最后一天为周5,把下一年加上 5天对 7 取余为 0 的,则是周日*/int i = 2000;for(;;) /*无循环终止条件,可以利用break 语句终止循环*/{if(i%4==0&&i%100!=0||i%400==0){days = days%7+366;else{days = days%7+365;3}if(days%7==0&&i%100==99) {printf("%d",i);break;}i++;}return 0;}3、马虎的算式:小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
蓝桥杯历届试题题目总结

蓝桥杯历届试题题⽬总结后天就是蓝桥杯省赛了,今天总结⼀下这段时间做的蓝桥杯历届试题,还是⼀个⼀个题⽬的来吧1,历届试题矩阵翻硬币 这个题⽬说真的,我不会,在⽹上看了某神⽜的题解答案为 ans=sqrt(n)*sqrt(m),具体怎么证明的我也不知道2,历届试题兰顿蚂蚁 这个题⽬怎么说呢,应该是送分题,直接模拟就可以了,这⾥就不说了。
3,历届试题分糖果 这个题⽬好像之前在哪⾥做过,也是⼀道模拟题,弄两个数组搞⼀下就可以了 下⾯是代码#include<bits/stdc++.h>using namespace std;#define maxn 100+10int a[2][maxn],n;bool ok(int cur){for (int i=2;i<=n;i++) if (a[cur][i]!=a[cur][i-1]) return0;return1;}int main(){while(scanf("%d",&n)!=EOF){int cur=0,ans=0;for (int i=1;i<=n;i++) scanf("%d",&a[cur][i]);while(!ok(cur)){for (int i=1;i<=n;i++) {if (a[cur][i]%2) {a[cur][i]++; ans++;}}for (int i=1;i<n;i++) a[1-cur][i]=a[cur][i+1]/2; a[1-cur][n]=a[cur][1]/2;for (int i=1;i<=n;i++) a[1-cur][i]+=(a[cur][i]/2);cur=1-cur;}printf("%d\n",ans);}return0;}View Code4,历届试题⼩朋友排队 这个题让我想起了去年武⼤校赛的⼀道题,我永远忘不了,求最⼩交换次数就是求逆序对数,⽽这个题要算出每个⼩朋友交换的次数,故我们从前⾯求⼀次,再从后⾯求⼀次就可以了,我这⾥⽤树状数组来求#include<bits/stdc++.h>using namespace std;#define maxn 1000000+10#define LL long longint a[maxn],n,b[maxn],num[maxn],c[maxn];LL sum[maxn];void init(){sum[0]=0;for (LL i=1;i<maxn;i++) sum[i]=sum[i-1]+i;}int lowbit(int x){return x&(-x);}void add(int x){while(x<maxn){a[x]++;x+=lowbit(x);}}int get_sum(int x){int ans=0;while(x>0){ans+=a[x];x-=lowbit(x);}return ans;}int main(){init();while(scanf("%d",&n)!=EOF){memset(a,0,sizeof(a));memset(num,0,sizeof(num));for (int i=1;i<=n;i++) scanf("%d",&b[i]),c[i]=b[i];sort(c+1,c+n+1);int m=unique(c+1,c+n+1)-c;for (int i=1;i<=n;i++) b[i]=lower_bound(c+1,c+m+1,b[i])-c;for (int i=1;i<=n;i++){num[i]+=get_sum(maxn-1)-get_sum(b[i]);add(b[i]);}memset(a,0,sizeof(a));for (int i=n;i>=1;i--){num[i]+=get_sum(b[i]-1);add(b[i]);}LL ans=0;//for (int i=1;i<=n;i++) printf("%d ",num[i]); printf("\n");for (int i=1;i<=n;i++) ans+=sum[num[i]];printf("%I64d\n",ans);}return0;}View Code5,历届试题波动数列 这个题⽬⼀看,就知道是枚举a出现的次数和b出现的次数,⽹上有⼈⽤BFS和DFS来做,想都不想,肯定超时可以设第⼀个数为x,则 S=n*x+sgm i*(a or -b),则知道a和b的数⽬为n*(n-1)/2,则可以枚举a的数⽬A,知道A后,就看组成A有多少种⽅法,⽽我们只能⽤1,2,。
2018蓝桥杯试题

2018蓝桥杯C语言b组国赛真题1.标题:换零钞x星球的钞票的面额只有:100元,5元,2元,1元,共4种。
小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。
小明有点强迫症,他坚持要求200元换出的零钞中2元的张数刚好是1元的张数的10倍,剩下的当然都是5元面额的。
银行的工作人员有点为难,你能帮助算出:在满足小明要求的前提下,最少要换给他多少张钞票吗?(5元,2元,1元面额的必须都有,不能是0)注意,需要提交的是一个整数,不要填写任何多余的内容。
手算都可以。
下面是代码,答案741.#include<iostream>ing namespace std;3.int main(){4.for(int i=1;i<40;i++){5.for(int j=1;j<200;j++){6.if(5*i+2*10*j+1*j==200)7.cout<<"5*"<<i<<"+2*"<<10*j<<"+1*"<<j<<"="<<5*i+2*10*j+1*j<<"(一共"<<i+10*j+j<<"张)"<<endl;8.}9.}10.return 0;11.}12.2.标题:激光样式x星球的盛大节日为增加气氛,用30台机光器一字排开,向太空中打出光柱。
安装调试的时候才发现,不知什么原因,相邻的两台激光器不能同时打开!国王很想知道,在目前这种bug存在的情况下,一共能打出多少种激光效果?显然,如果只有3台机器,一共可以成5种样式,即:全都关上(sorry, 此时无声胜有声,这也算一种)开一台,共3种开两台,只1种30台就不好算了,国王只好请你帮忙了。
历年蓝桥杯省赛B组真题试题

(1)煤球数目有一堆煤球,堆成三角棱锥形。
具体:第一层放1个,第二层3个(排列成三角形),第三层6个(排列成三角形),第四层10个(排列成三角形),....如果一共有100层,共有多少个煤球?题解:纯粹的数学题而已int a[101] ={0};for(int i = 1 ; i < 101 ; i ++) a[i] = a[i-1] + i;int ans = 0;for(int j = 1 ; j < 101 ; j ++) ans += a[j];printf("%d\n",ans);(2)生日蜡烛某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?请填写他开始过生日party的年龄数。
题解:暴力枚举。
第一重循环枚举刚开始过生日时候的岁数。
第二重循环是枚举现在的岁数第三重循环就是将刚开始过生日的岁数和现在的岁数加起来。
int start,end;for(start = 1 ; start < 236 ; start ++){for( end = start ; end < 236 ; end ++ ){int sum = 0;for(int i = start; i <= end; i ++)sum += i;if( sum == 236)printf("start : %d end : %d\n",start,end);}}B DEFA + — + —— = 10C GHI(如果显示有问题,可以参见【图1.jpg】)这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:6+8/3+952/714 就是一种解法,5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?//29题解:DFS+回溯由于计算机中5/2会等于2,而且如果打算采用精度方面的处理的话,会很麻烦,而且很容易错。
历年蓝桥杯省赛B组真题试题

(1)煤球数目有一堆煤球,堆成三角棱锥形。
具体:第一层放1个,第二层3个(排列成三角形),第三层6个(排列成三角形),第四层10个(排列成三角形),....如果一共有100层,共有多少个煤球?题解:纯粹的数学题而已int a[101] ={0};for(int i = 1 ; i < 101 ; i ++)a[i] = a[i-1] + i;int ans = 0;for(int j = 1 ; j < 101 ; j ++)ans += a[j];printf("%d\n",ans);(2)生日蜡烛某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。
现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?请填写他开始过生日party的年龄数。
题解:暴力枚举。
第一重循环枚举刚开始过生日时候的岁数。
第二重循环是枚举现在的岁数第三重循环就是将刚开始过生日的岁数和现在的岁数加起来。
int start,end;for(start = 1 ; start < 236 ; start ++){for( end = start ; end < 236 ; end ++ ){int sum = 0;for(int i = start; i <= end; i ++)sum += i;if( sum == 236)printf("start : %d end : %d\n",start,end);}}B DEFA + — + —— = 10C GHI(如果显示有问题,可以参见【图1.jpg】)这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:6+8/3+952/714 就是一种解法,5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?//29题解:DFS+回溯由于计算机中5/2会等于2,而且如果打算采用精度方面的处理的话,会很麻烦,而且很容易错。
蓝桥杯题库的历届真题

1.历届试题矩阵翻硬币时间限制:1.0s 内存限制:256.0MB问题描述小明先把硬币摆成了一个n 行m 列的矩阵。
随后,小明对每一个硬币分别进行一次Q 操作。
对第x行第y列的硬币进行Q 操作的定义:将所有第i*x 行,第j*y 列的硬币进行翻转。
其中i和j为任意使操作可行的正整数,行号和列号都是从1开始。
当小明对所有硬币都进行了一次Q 操作后,他发现了一个奇迹——所有硬币均为正面朝上。
小明想知道最开始有多少枚硬币是反面朝上的。
于是,他向他的好朋友小M寻求帮助。
聪明的小M告诉小明,只需要对所有硬币再进行一次Q操作,即可恢复到最开始的状态。
然而小明很懒,不愿意照做。
于是小明希望你给出他更好的方法。
帮他计算出答案。
输入格式输入数据包含一行,两个正整数n m,含义见题目描述。
输出格式输出一个正整数,表示最开始有多少枚硬币是反面朝上的。
样例输入2 3样例输出1数据规模和约定对于10%的数据,n、m <= 10^3;对于20%的数据,n、m <= 10^7;对于40%的数据,n、m <= 10^15;对于10%的数据,n、m <= 10^1000(10的1000次方)。
2.历届试题兰顿蚂蚁时间限制:1.0s 内存限制:256.0MB问题描述兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种。
平面上的正方形格子被填上黑色或白色。
在其中一格正方形内有一只“蚂蚁”。
蚂蚁的头部朝向为:上下左右其中一方。
蚂蚁的移动规则十分简单:若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格;若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格。
规则虽然简单,蚂蚁的行为却十分复杂。
刚刚开始时留下的路线都会有接近对称,像是会重复,但不论起始状态如何,蚂蚁经过漫长的混乱活动后,会开辟出一条规则的“高速公路”。
蚂蚁的路线是很难事先预测的。
你的任务是根据初始状态,用计算机模拟兰顿蚂蚁在第n步行走后所处的位置。
历年蓝桥杯省赛B组真题试题

for(j = 0 ; j < 4 ; j ++) flag[i][j] = 1;
flag[0][0] = 0; flag[2][3] = 0; }
void Solve() {
int dir[8][2] = { 0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1}; int book = true; for(int i = 0 ; i < 3 ; i ++) {
int main() {
int i; int a[] = {5,13,6,24,2,8,19,27,6,12,1,17}; int N = 12;
quicksort(a, 0, N -1);
for(i=0; i<N; i++) printf("%d ", a[i]); printf("\n");
return 0; }
num[n]=0;
}
}
}
int main() {
memset(num,0,sizeof(num)); memset(visit,0,sizeof(visit)); dfs(1); cout<<sum; return 0; }
4 / 19
(4) 快速排序
历年蓝桥杯省赛 B 组真题试题
排序在各种场合经常被用到。 快速排序是十分常用的高效率的算法。
if(!visit[i]) {
visit[i] = true; mpt[x][y] = i; dfs(index+1); visit[i] = false; } } } else { dfs(index+1); } } int main() { init(); dfs(0); printf("%d\n",ans); return 0; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2018蓝桥杯C语言b组国赛真题1.标题:换零钞x星球的钞票的面额只有:100元,5元,2元,1元,共4种。
小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。
小明有点强迫症,他坚持要求200元换出的零钞中2元的张数刚好是1元的张数的10倍,剩下的当然都是5元面额的。
银行的工作人员有点为难,你能帮助算出:在满足小明要求的前提下,最少要换给他多少张钞票吗?(5元,2元,1元面额的必须都有,不能是0)注意,需要提交的是一个整数,不要填写任何多余的内容。
手算都可以。
下面是代码,答案741.#include<iostream>ing namespace std;3.int main(){4.for(int i=1;i<40;i++){5.for(int j=1;j<200;j++){6.if(5*i+2*10*j+1*j==200)7.cout<<"5*"<<i<<"+2*"<<10*j<<"+1*"<<j<<"="<<5*i+2*10*j+1*j<<"(一共"<<i+10*j+j<<"张)"<<endl;8.}9.}10.return 0;11.}12.13. 2.标题:激光样式14.x星球的盛大节日为增加气氛,用30台机光器一字排开,向太空中打出光柱。
15.安装调试的时候才发现,不知什么原因,相邻的两台激光器不能同时打开!16.国王很想知道,在目前这种bug存在的情况下,一共能打出多少种激光效果?17.显然,如果只有3台机器,一共可以成5种样式,即:18.全都关上(sorry, 此时无声胜有声,这也算一种)19.开一台,共3种20.开两台,只1种21.30台就不好算了,国王只好请你帮忙了。
22.要求提交一个整数,表示30台激光器能形成的样式种数。
23.注意,只提交一个整数,不要填写任何多余的内容。
思路很简单,暴力搜索,30个灯光从左到右,从左边第一个开始,第一个可以开关,第二个要根据左边的灯光是否开启来取值,以此类推。
答案21783091.#include<iostream>2.#include<string.h>ing namespace std;4.int ans = 0;5.int x[31];//0代表关,1代表开6.7.void dfs(int index){8.if(index == 30){9.ans++;10.return;11.}12.if(index == 0 || x[index-1] == 0){ //第一个灯光可以取0或1,当前灯光左边要是没开,那当前灯光可以取0和113.for(int i=0;i<=1;i++){14.x[index] = i;15.dfs(index+1);16.x[index] = 0;17.}18.}19.else{ //左边的灯光开了,那当前灯光只能关闭(取0)20.dfs(index+1);21.}22.}23.24.int main(){25.memset(x,0,31*sizeof(int));26.dfs(0);27.cout<<ans<<endl;28.return0;29.}30. 3.标题:格雷码31.格雷码是以n位的二进制来表示数。
32.与普通的二进制表示不同的是,它要求相邻两个数字只能有1个数位不同。
33.首尾两个数字也要求只有1位之差。
34.有很多算法来生成格雷码。
以下是较常见的一种:35.从编码全0开始生成。
36.当产生第奇数个数时,只把当前数字最末位改变(0变1,1变0)37.当产生第偶数个数时,先找到最右边的一个1,把它左边的数字改变。
38.用这个规则产生的4位格雷码序列如下:39.000040.000141.001142.001043.011044.011145.010146.010047.110048.110149.111150.111051.101052.101153.100154.100055.以下是实现代码,仔细分析其中逻辑,并填写划线部分缺少的代码。
(答案:a^((a&(-a))<<1))1.#include <stdio.h>2.void show(int a,int n){3.int i;4.int msk = 1;5.for(i=0; i<n-1; i++) msk = msk << 1;6.for(i=0; i<n; i++){7.printf((a & msk)? "1" : "0");8.msk = msk >> 1;9.}10.printf("\n");11.}12.void f(int n){13.int i;14.int num = 1;15.for(i=0; i<n; i++) num = num<<1;16.int a = 0;17.for(i=0; i<num; i++){18.show(a,n);19.if(i%2==0){20. a = a ^ 1;21.}22.else{23. a = _________________________ ; //填空24.}25.}26.}27.int main(){28.f(4);29.return0;30.}请注意:只需要填写划线部分缺少的内容,不要抄写已有的代码或符号。
4.标题:调手表小明买了块高端大气上档次的电子手表,他正准备调时间呢。
在 M78 星云,时间的计量单位和地球上不同,M78 星云的一个小时有 n 分钟。
大家都知道,手表只有一个按钮可以把当前的数加一。
在调分钟的时候,如果当前显示的数是 0 ,那么按一下按钮就会变成 1,再按一次变成 2 。
如果当前的数是 n - 1,按一次后会变成 0 。
作为强迫症患者,小明一定要把手表的时间调对。
如果手表上的时间比当前时间多1,则要按 n - 1 次加一按钮才能调回正确时间。
小明想,如果手表可以再添加一个按钮,表示把当前的数加 k 该多好啊……他想知道,如果有了这个 +k 按钮,按照最优策略按键,从任意一个分钟数调到另外任意一个分钟数最多要按多少次。
注意,按 +k 按钮时,如果加k后数字超过n-1,则会对n取模。
比如,n=10, k=6 的时候,假设当前时间是0,连按2次 +k 按钮,则调为2。
「输入格式」一行两个整数 n, k ,意义如题。
「输出格式」一行一个整数表示:按照最优策略按键,从一个时间调到另一个时间最多要按多少次。
「样例输入」5 3「样例输出」2「样例解释」如果时间正确则按0次。
否则要按的次数和操作系列之间的关系如下:1:+12:+1, +13:+34:+3, +1「数据范围」对于 30% 的数据 0 < k < n <= 5对于 60% 的数据 0 < k < n <= 100对于 100% 的数据 0 < k < n <= 100000资源约定:峰值内存消耗(含虚拟机) < 256MCPU消耗 < 1000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。
注意:main函数需要返回0;只使用ANSI C/ANSI C++ 标准;不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。
5.标题:搭积木小明对搭积木非常感兴趣。
他的积木都是同样大小的正立方体。
在搭积木时,小明选取 m 块积木作为地基,将他们在桌子上一字排开,中间不留空隙,并称其为第0层。
随后,小明可以在上面摆放第1层,第2层,……,最多摆放至第n层。
摆放积木必须遵循三条规则:规则1:每块积木必须紧挨着放置在某一块积木的正上方,与其下一层的积木对齐;规则2:同一层中的积木必须连续摆放,中间不能留有空隙;规则3:小明不喜欢的位置不能放置积木。
其中,小明不喜欢的位置都被标在了图纸上。
图纸共有n行,从下至上的每一行分别对应积木的第1层至第n层。
每一行都有m个字符,字符可能是‘.’或‘X’,其中‘X’表示这个位置是小明不喜欢的。
现在,小明想要知道,共有多少种放置积木的方案。
他找到了参加蓝桥杯的你来帮他计算这个答案。
由于这个答案可能很大,你只需要回答这个答案对1000000007(十亿零七)取模后的结果。
注意:地基上什么都不放,也算作是方案之一种。
【输入格式】输入数据的第一行有两个正整数n和m,表示图纸的大小。
随后n行,每行有m个字符,用来描述图纸。
每个字符只可能是‘.’或‘X’。
【输出格式】输出一个整数,表示答案对1000000007取模后的结果。
【样例输入1】2 3..X.X.【样例输出1】4【样例说明1】成功的摆放有(其中O表示放置积木):(1)..X.X.(2)..XOX.(3)O.XOX.(4)..X.XO【样例输入2】3 3..X.X....【样例输出2】16【数据规模约定】对于10%的数据,n=1,m<=30;对于40%的数据,n<=10,m<=30;对于100%的数据,n<=100,m<=100。
资源约定:峰值内存消耗(含虚拟机) < 256MCPU消耗 < 1000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。
注意:main函数需要返回0;只使用ANSI C/ANSI C++ 标准;不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。
6.标题:矩阵求和经过重重笔试面试的考验,小明成功进入 Macrohard 公司工作。
今天小明的任务是填满这么一张表:表有 n 行 n 列,行和列的编号都从1算起。
其中第 i 行第 j 个元素的值是 gcd(i, j)的平方,gcd 表示最大公约数,以下是这个表的前四行的前四列:1 1 1 11 4 1 41 1 9 11 4 1 16小明突然冒出一个奇怪的想法,他想知道这张表中所有元素的和。