第十届蓝桥杯大赛软件类省赛C/C++大学B组

第十届蓝桥杯大赛软件类省赛C/C++大学B组

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

  1. 试题A:组队
  2. 试题B:年号字串
  3. 试题C:数列求值
  4. 试题D:数的分解
  5. 试题F:特别数的和

试题A:组队
本题总分: 5分
[问题描述]
作为篮球队教练,你需要从以下名单中选出1号位至5号位各一名球员,组成球队的首发阵容。每位球员担任1号位至5号位时的评分如下表所示。请你计算首发阵容1号位至5号位的评分之和最大可能是多少?
在这里插入图片描述

**【思路】**从【1-5】序号列下找到该得分最大的球员,记录,然后看有没有重复的,有重复,继续找得分第二大的球员比较两次得分只差,选择保留差值最大的 。
在这里插入图片描述

**【答案】**490

试题B:年号字串
本题总分:5分
[问题描述]
小明用字母A对应数字1,B对应2,以此类推,用Z对应26.对于27以上的数字,小明用两位或更长位的字符串来对应,例如AA对应27,AB对应28,AZ对应52,LQ对应329。
请问2019对应的字符串是什么?
**【思路】**把它看成26进制(相似题EXCEL表格求对应列)

#include <iostream>
using namespace std;
int main()
{
    int num=2019;
    string s;
    while(num){
        char c='A'+(num%26-1);//这里A是1开始所以-1
        s=c+s;
        num/=26;
    }
    cout<<s<<endl;
    return 0;
}

【答案】BYQ

试题C:数列求值
本题总分: 10分
[问题描述]
给定数列1, 1,1,3,5,9, 17,.,从第4项开始,每项都是前3项的和。求
第20190324项的最后4位数字。

#include <iostream>
using namespace std;
int main()
{
    int a[3]={1,1,1};
    for(int i=4;i<=20190324;i++){
        int k=a[0]+a[1]+a[2];
        a[0]=a[1];
        a[1]=a[2];
        a[2]=k%10000;//因为只要最后4位,就取模
    }
    cout<<a[2]<<endl;
    return 0;
}

【答案】4659

试题D:数的分解
本题总分: 10分
[问题描述]
把2019分解成3个各不相同的正整数之和,并且要求每个正整数都不包含数字2和4,一共有多少种不同的分解方法?注意交换3个整数的顺序被视为同一种方法,例如1000+1001+18 和1001+1000+18被视为同一种。

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
inline string toString(int a){
    ostringstream os;
    os<<a;
    return os.str();
}
bool fun(int n){//判断有无2 4
    string s=toString(n);
    for(int f=0;f<s.length();f++){
        if(s[f]=='2'||s[f]=='4'){
        return false;
        }
    }
    return true;
}
int main()
{
    int sum=0;
    bool flag;
    for(int i=1;i<673;i++){
        flag=fun(i);
        if(flag){
            for(int j=i+1;j<=(2019-i)/2;j++){
                flag=fun(j);
                if(flag){
                    int k=2019-i-j;
                    flag=fun(k);
                    if(flag&&k>j)sum++;//这样子就可以保证i<j<k他们的次序就是唯一的了
                }
            }
        }
    }
    cout<<sum<<endl;
    return 0;
}

**【答案】**40785
试题E:迷宫
本题总分: 15 分
[问题描述]
下图给出了一个迷宫的平面图,其中标记为1的为障碍,标记为0的为可
以通行的地方。
010000
000100
001001
110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这个它的上、下、左、右四个方向之一。对于,上面的迷宫,从入口开始,可以按DRRURRDDDR的顺序通过迷宫,一共10步。其中D、U、L、R分别表示向下、向上、向左、向右走。对于下面这个更复杂的迷宫(30 行50列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。请注意在字典序中D<L<R<U。( 如果你把以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。

//之前走迷宫有个最左原理,就是一直靠着左墙走就能走出迷宫,晚些试试深度优先

试题F:特别数的和
时间限制: 1.0s内 存限制: 256.0MB本题总分: 15分
[问题描述]
小明对数位中含有2、0、1、9的数字很感兴趣(不包括前导0),在1到
40中这样的数包括1、2、9、10至32、39和40,共28个,他们的和是574.
请问,在1到n中,所有这样的数的和是多少?
[输入格式]
输入一行包含两个整数n。
[输出格式]
输出一行,包含一个整数,表示满足条件的数的和。

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
inline string toString(int a){
    ostringstream os;
    os<<a;
    return os.str();
}
bool fun(int n){
    string s=toString(n);
    for(int f=0;f<s.length();f++){
        if(s[f]=='2'||s[f]=='0'||s[f]=='1'||s[f]=='9'){
        return true;
        }
    }
    return false;
}
int main()
{
    int n;
    long long int sum=0;
    bool flag;
    cin>>n;
    for(int i=1;i<=n;i++){
        flag=fun(i);
        if(flag){
            sum+=i;
        }
    }
    cout<<sum<<endl;
    return 0;
}

试题G:完全二叉树的权值
时间限制: 1.0s内存限制: 256.0MB本题总分: 20分
[问题描述]
给定一棵包含N个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是AI, A2,… AN,如下图所示:
在这里插入图片描述

现在小明要把相同深度的节点的权值加在一起, 他想知道哪个深度的节点权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。注:根的深度是1.
[输入格式]
第一行包含一个整数N。
第二行包含N个整数AI, A2,… AN。
[输出格式]
输出一个整数代表答案。

#include <bits/stdc++.h>
using namespace std;
long long int a[100005];//INF大约是一个19位的值
int main()
{
    int n,i,layer,maxx,t=1,add=0;
    int num=0;
    memset(a,0,sizeof(a));
    cin>>n;
    cin>>maxx;//先规定第一层是最大数
    int k=1;//从第二层开始
    for(i=1;i<n;i++){
        num=t*2;
        if(k<=num){//如果当前编号小于当前层有的节点数
            cin>>a[i];
            add+=a[i];//累加这层数
            if(k==num){
                t++;
                if(maxx<add){
                maxx=add;
                layer=t;
                }
                k=0;
                add=0;//将这层累加的数置零,下一层重新累加
            }
        }
        k++;
    }
    cout<<layer<<endl;
    return 0;
}

试题H:等差数列
时间限制: 1.0s内存限制: 256.0MB本题总分: 20分
[问题描述]
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N个整数。现在给出这N个整数,小明想知道包含这N个整数的最短的等差数列有
几项?
[输入格式]
输入的第一行包含一个整数N.第二行包含N个整数A1,A2,…,AN。(注意AI~AN并不一定是按等差数
列中的顺序给出)
[输出格式]
输出一个整数表示答案。

#include <bits/stdc++.h>
//排序,遍历,求出两项最小差值
using namespace std;
typedef long long ll;
int main()
{
    int n,num,minn,d;
    ll a[100005];
    memset(a,0,sizeof(a));
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n);//从小到大排序
    minn=a[1]-a[0];
    for(int i=1;i<n-1;i++){//因为最后是i+1,所以这里遍历到n-1
        d=a[i+1]-a[i];
        minn=min(minn,d);//找到最小差值
    }
    num=(a[n-1]-a[0])/minn+1;
    cout<<num<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值