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

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

【传送门】
第六届蓝桥杯大赛个人赛省赛(软件类) C/C++大学B组
第十届蓝桥杯大赛软件类省赛C/C++大学B组
第十一届蓝桥杯大赛软件类省赛第二场C/C++大学B组
第十二届蓝桥杯大赛模拟赛(第四期)
第七届蓝桥杯大赛个人赛省赛(软件类) C/C++大学B组
蓝桥杯基础试题整合C++

  1. 煤球数目
  2. 生日蜡烛
  3. 凑算式
  4. 快速排序
  5. 抽签
  6. 方格填数

煤球数目
有一堆煤球,堆成三角棱锥形.具体:
第一层放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的数字.要求:连续的两个数字不能相邻.
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数.
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字.
在这里插入图片描述

在这里插入代码片
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值