第七届蓝桥杯省赛C/C++B组赛题及答案

第一题

【题目】

煤球数目

有一堆煤球,堆成三角棱锥形。具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
....
如果一共有100层,共有多少个煤球?

请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

【提示】

找出每一层煤球个数的规律,循环累加计算

【答案】

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int i,s=1,num=1;
 5     for(i=2;i<=100;i++)
 6     {
 7         s+=i;
 8         num+=s;
 9     }
10     printf("%d",num);
11     getchar();
12     return 0;
13 }

第二题

【题目】

生日蜡烛

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

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

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

请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

【提示】

可以看做中间n项的等差数列求和,已知公差为1,Sn=236,求a1,Sn=n*a1+n*(n-1)/2,双层循环,输出符合的n和a1(题目只要a1

【答案】

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int i,j;
 5     for(i=1;i<120;i++)
 6     for(j=2;j<120-i;j++)
 7     if((i*j+j*(j-1)/2.0)==236) printf("%d",i);
 8     getchar();
 9     return 0;
10 } 

第三题

【题目】

凑算式


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

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

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

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

【提示】

方法一:用九层循环遍历所有可能,判断满足条件的组合;

方法二:回溯法,排列树遍历,可加入剪枝算法;

【答案】

 1 #include <stdio.h>
 2 void swap(int &a,int &b)
 3 {
 4     int t;
 5     t=a;
 6     a=b;
 7     b=t;
 8 }
 9 void output(int*x,int &count){
10     if((x[0]+x[1]*1.0/x[2]+((x[3]*100+x[4]*10+x[5])*1.0/(x[6]*100+x[7]*10+x[8])))==10.0){
11         count++;
12         printf("%d+%d/%d+%d%d%d/%d%d%d\n",x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8]);
13     }
14
15 }
16 void Backtrack(int t,int *x,int &count)
17 {
18     if(t>=9)
19         output(x,count);
20     else
21         for(int i=t;i<9;i++){
22             swap(x[t],x[i]);
23             Backtrack(t+1,x,count);
24             swap(x[t],x[i]);
25         }
26 }
27 int main()
28 {
29     int x[]={1,2,3,4,5,6,7,8,9},count=0;
30     Backtrack(0,x,count);
31     printf("%d",count);
32     return 0;
33 }

第四题

【题目】

快速排序

排序在各种场合经常被用到。
快速排序是十分常用的高效率的算法。

其思想是:先选一个“标尺”,
用它把整个队列过一遍筛子,
以保证:其左边的元素都不大于它,其右边的元素都不小于它。

这样,排序问题就被分割为两个子区间。
再分别对子区间排序就可以了。

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

#include <stdio.h>

void swap(int a[], int i, int j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}

int partition(int a[], int p, int r)
{
int i = p;
int j = r + 1;
int x = a[p];
while(1){
while(i<r && a[++i]<x);
while(a[--j]>x);
if(i>=j) break;
swap(a,i,j);
}
______________________;
return j;
}

void quicksort(int a[], int p, int r)
{
if(p<r){
int q = partition(a,p,r);
quicksort(a,p,q-1);
quicksort(a,q+1,r);
}
}

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;
}

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

【提示】

理解各个函数作用即可

【答案】

 1 #include <stdio.h>
 2
 3 void swap(int a[], int i, int j)
 4 {
 5     int t = a[i];
 6     a[i] = a[j];
 7     a[j] = t;
 8 }
 9
10 int partition(int a[], int p, int r)
11 {
12     int i = p;
13     int j = r + 1;
14     int x = a[p];
15     while(1){
16         while(i<r && a[++i]<x);
17         while(a[--j]>x);
18         if(i>=j) break;
19         swap(a,i,j);
20     }
21     swap(a,p,j);
22     return j;
23 }
24
25 void quicksort(int a[], int p, int r)
26 {
27     if(p<r){
28         int q = partition(a,p,r);
29         quicksort(a,p,q-1);
30         quicksort(a,q+1,r);
31     }
32 }
33
34 int main()
35 {
36     int i;
37     int a[] = {5,13,6,24,2,8,19,27,6,12,1,17};
38     int N = 12;
39
40     quicksort(a, 0, N-1);
41
42     for(i=0; i<N; i++) printf("%d ", a[i]);
43     printf("\n");
44
45     return 0;
46 }

第五题

【题目】

抽签

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 <stdio.h>
#define N 6
#define M 5
#define BUF 1024

void f(int a[], int k, int m, char b[])
{
int i,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<i; j++) b[M-m+j] = k+‘A‘;
______________________; //填空位置
}
}
int main()
{
int a[N] = {4,2,2,1,1,3};
char b[BUF];
f(a,0,M,b);
return 0;
}

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

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

【提示】

理解各个函数作用即可

【答案】

 1 #include <stdio.h>
 2 #define N 6
 3 #define M 5
 4 #define BUF 1024
 5
 6 void f(int a[], int k, int m, char b[])
 7 {
 8     int i,j;
 9
10     if(k==N){
11         b[M] = 0;
12         if(m==0) printf("%s\n",b);
13         return;
14     }
15
16     for(i=0; i<=a[k]; i++){
17         for(j=0; j<i; j++) b[M-m+j] = k+‘A‘;
18         f(a,k+1,m-i,b);  //填空位置
19     }
20 }
21 int main()
22 {
23     int  a[N] = {4,2,2,1,1,3};
24     char b[BUF];
25     f(a,0,M,b);
26     return 0;
27 }

第六题

【题目】

方格填数

如下的10个格子

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

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

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

【提示】

把方格看做大小为10的数组,排列树0~9,统计满足关系的特殊排列

【答案】

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 void swap(int &a,int &b)
 4 {
 5     int t;
 6     t=a;
 7     a=b;
 8     b=t;
 9 }
10 void output(int *x,int &count){
11     if(
12         (abs(x[0]-x[1])!=1&&abs(x[0]-x[3])!=1&&abs(x[0]-x[4])!=1&&abs(x[0]-x[5])!=1)&&
13         (abs(x[1]-x[2])!=1&&abs(x[1]-x[4])!=1&&abs(x[1]-x[5])!=1&&abs(x[1]-x[6])!=1)&&
14         (abs(x[2]-x[5])!=1&&abs(x[2]-x[6])!=1)&&
15         (abs(x[3]-x[4])!=1&&abs(x[3]-x[7])!=1&&abs(x[3]-x[8])!=1)&&
16         (abs(x[4]-x[5])!=1&&abs(x[4]-x[7])!=1&&abs(x[4]-x[8])!=1&&abs(x[4]-x[9])!=1)&&
17         (abs(x[5]-x[6])!=1&&abs(x[5]-x[8])!=1&&abs(x[5]-x[9])!=1)&&
18         (abs(x[6]-x[9])!=1)&&
19         (abs(x[7]-x[8])!=1)&&
20         (abs(x[8]-x[9])!=1)
21       )
22         count++;
23
24 }
25 void Backtrack(int t,int *x,int &count)
26 {
27     if(t>=10)
28         output(x,count);
29     else
30         for(int i=t;i<10;i++){
31             swap(x[t],x[i]);
32             Backtrack(t+1,x,count);
33             swap(x[t],x[i]);
34         }
35 }
36 int main()
37 {
38     int x[]={0,1,2,3,4,5,6,7,8,9},count=0;
39     Backtrack(0,x,count);
40     printf("%d",count);
41     return 0;
42 }

第七题

【题目】

剪邮票

, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,中,粉红色所示部分就是合格的剪取。

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

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

【提示】

【答案】

第八题

【题目】

【提示】

【答案】

原文地址:https://www.cnblogs.com/pengchuan/p/6793826.html

时间: 2024-09-30 07:46:01

第七届蓝桥杯省赛C/C++B组赛题及答案的相关文章

2016年第七届蓝桥杯C/C++程序设计本科B组决赛

2.答案300 刁丝卫代码,比赛时long long写成int,结果成了263...一等擦肩而过... #include <iostream> #include <fstream> #include <cstring> #define LL long long using namespace std; bool mark[100]; LL res[100],sum=0; bool tmpmark[10]; bool judge(LL x){ memset(tmpmark

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

第七届蓝桥杯省赛7:剪邮票

第七届蓝桥杯省赛7:剪邮票 如[图1.jpg], 有12张连在一起的12生肖的邮票. 现在你要从中剪下5张来,要求必须是连着的. (仅仅连接一个角不算相连) 比如,[图2.jpg],[图3.jpg]中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不同的剪取方法. 请填写表示方案数目的整数. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 解决思路:先将所有五个一组的情况遍历,然后用广度优先判断是否连通. 我在选五个一组的时候是用的 for 先选出第几个邮票,然后将其

第七届蓝桥杯C语言C组-(自己懂的题目)

第七届蓝桥杯C语言C组-(自己懂的题目) 表示刚刚查了成绩,省赛一等奖,有资格去北京了,然后写一下总结, 先来写一下我懂的题目,毕竟我也是菜鸟,听说国赛比预赛难几个等级... 第一题 报纸页数 X星球日报和我们地球的城市早报是一样的, 都是一些单独的纸张叠在一起而已.每张纸印有4版. 比如,某张报纸包含的4页是:5,6,11,12, 可以确定它应该是最上边的第2张报纸. 我们在太空中捡到了一张X星球的报纸,4个页码分别是: 1125,1126,1727,1728 请你计算这份报纸一共多少页(也就

算法笔记_212:第七届蓝桥杯软件类决赛真题(Java语言B组)

目录 1 愤怒小鸟 2 反幻方 3 打靶 4 路径之谜 5 碱基 6 圆圈舞 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 愤怒小鸟 愤怒小鸟 X星球愤怒的小鸟喜欢撞火车! 一根平直的铁轨上两火车间相距 1000 米 两火车 (不妨称A和B) 以时速 10米/秒 相对行驶. 愤怒的小鸟从A车出发,时速50米/秒,撞向B车, 然后返回去撞A车,再返回去撞B车,如此往复.... 两火车在相距1米处停车. 问:这期间愤怒的小鸟撞 B 车多少次? 注意:需要提交的是一个整数(表示撞B车的次数),不要

第七届蓝桥杯本科B组省赛

煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), -. 如果一共有100层,共有多少个煤球? 请填表示煤球总数目的数字. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 思路: 推出第i层有i*(i+1)/2个煤球,累加到100层即可,答案为171700 #include <bits/stdc++.h> using namespace std; int main() {

第七届蓝桥杯C\C++B组省赛题目——方格填数

第一部分:题目 方格填数 如下的10个格子   +--+--+--+   |  |  |  |+--+--+--+--+|  |  |  |  |+--+--+--+--+|  |  |  |+--+--+--+ (如果显示有问题,也可以参看下图) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数.注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 第二部分:思路 这个题目有点表述不明,不知道0~

第七届蓝桥杯C/C++B组省赛题目解析

题目1:煤球数目 有一堆煤球,堆成三角棱锥形.具体:第一层放1个,第二层3个(排列成三角形),第三层6个(排列成三角形),第四层10个(排列成三角形),....如果一共有100层,共有多少个煤球?请填表示煤球总数目的数字.注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 解析: 第一层:1个. 第二层:2*3-3=3个. 第三层:3*3-3=6个. 第四层:4*3-3=10个. 代码如下: int s=0,a=0; for(int i=1;i<=100;i++){ a=a+i;

第七届蓝桥杯大赛个人赛省赛(软件类)B组

3.凑算式 B      DEFA + --- + ------- = 10     C      GHI     (如果显示有问题,可以参见[图1.jpg])   这个算式中A~I代表1~9的数字,不同的字母代表不同的数字. 比如:6+8/3+952/714 就是一种解法,5+3/1+972/486 是另一种解法. 这个算式一共有多少种解法? 注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字. 这道有点坑吧,尤其对于我这种看题不仔细的,看到题是想着"/"这个运算是整数的,