第七届蓝桥杯大赛个人赛省赛(软件类) C/C++大学B组
【传送门】
第六届蓝桥杯大赛个人赛省赛(软件类) C/C++大学B组
第十届蓝桥杯大赛软件类省赛C/C++大学B组
第十一届蓝桥杯大赛软件类省赛第二场C/C++大学B组
第十二届蓝桥杯大赛模拟赛(第四期)
第七届蓝桥杯大赛个人赛省赛(软件类) C/C++大学B组
蓝桥杯基础试题整合C++
- 煤球数目
- 生日蜡烛
- 凑算式
- 快速排序
- 抽签
- 方格填数
煤球数目
有一堆煤球,堆成三角棱锥形.具体:
第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),
如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字.
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字.
答案:171700
#include <iostream>
using namespace std;
int main()
{
int sum=0;//当前煤球的个数
int tier=0;//当前层的煤球个数
for(int i=1;i<=100;i++){
tier+=i;
sum+=tier;
}
cout<<sum<<endl;
return 0;
}
生日蜡烛
某君从某年开始每年都举办一次生日party, 并且每次都要吹熄与年龄相同根数的蜡烛.现在算起来,他一共吹熄了236 根蜡烛.请问,他从多少岁开始过生日party 的?请填写他开始过生日party的年龄数.
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字.
答案:可以从236岁开始吹蜡烛嘛??
正解:26
#include <iostream>
using namespace std;
//类似滑动窗口的解法
int main()
{
int sum=0;
int k=1,i=1;
while(i<236){
sum+=i;
while(sum>236){
sum-=k;
k++;
}
if(sum==236){
cout<<k<<endl;
break;
}
i++;
}
return 0;
}
凑算式
这个算式中A ~ I代表1~9的数字,不同的字母代表不同的数字.
比如:
6+8/3+952/714就是一种解法,
5+3/1+972/486是另一种解法.
这个算式一共有多少种解法?
答案:29
#include <bits/stdc++.h>
using namespace std;
int ans=0;
void check(int a,int b,int c,int d,int e){
//把分数通分
int tf_1;//分子
int tf_2;//分母
tf_1=b*e+c*d;
tf_2=c*e;
if(tf_1%tf_2==0){
if((a+tf_1/tf_2)==10)
ans++;
}
}
int main()
{
int num[10]={1,2,3,4,5,6,7,8,9};
int num1,num2,num3,num4,num5;
do{
num1=num[0];
num2=num[1];
num3=num[2];
num4=num[3]*100+num[4]*10+num[5];
num5=num[6]*100+num[7]*10+num[8];
check(num1,num2,num3,num4,num5);
}while(next_permutation(num,num+9));//全排列
cout<<ans<<endl;
return 0;
}
快速排序
排序在各种场合经常被用到.
快速排序是十分常用的高效率的算法.
其思想是:先选一个“标尺",
用它把整个队列过一遍筛子,
以保证:其左边的元素都不大于它,其右边的元素都不小于它.
这样,排序问题就被分割为两个子区间.
再分别对子区间排序就可以了.
下面的代码是一种实现,请分析并填写划线部分缺少的代码.
答案:swap(a,p,j)
#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);//交换
}
//填空——————
swap(a,p,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);//选择a数组进行排序,下标从0—N-1
for(i=0;i<N;i++)
printf("%d",a[i]);
printf("\n");
return 0;
}
抽签
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
#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){//如果人数超出5人
b[M]=0;
if(m==0) printf("%s\n",b);
return;
}
for(i=0; i<=a[k]; i++){//从第一个国家开始
//把当前选取的组合存入到b[]中
for(j=0; j<i; j++) b[M-m+j] = k+'A';
//填空位置用一个递归缩小问题规模
f(a,k+1,m-i,b);//考虑第二个国家
//填空位置
}
}
int main()
{
int a[N] = {4,2,2,1,1,3};//每个国家可以派出的最多的名额
char b[BUF];
f(a,0,M,b);
return 0;
}
方格填数
填人0~9的数字.要求:连续的两个数字不能相邻.
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数.
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字.
在这里插入代码片