第十二届蓝桥杯大赛软件赛决赛(C/C++ 大学C组)

本文解析了蓝桥杯2021年的多项C/C++题目,涉及整数表示、带宽计算、纯质数判断、日期完全性、二进制问题等,提供了详细的解题思路和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  蓝桥杯个人赛软件类历届真题及其解析

  省流,十道签到题。


试题 A: 整数范围

本题总分: 5 5 5


【问题描述】

  用 8 8 8 位二进制(一个字节)来表示一个非负整数,表示的最小值是 0 0 0,则一般能表示的最大值是多少?

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


255


#include <stdio.h>

int main() {
   
    printf("%d", 0xff);
}

   ¿ ¿ ¿


试题 B: 带宽

本题总分: 5 5 5


【问题描述】

  小蓝家的网络带宽是 200 200 200 M b p s \mathrm{Mbps} Mbps,请问,使用小蓝家的网络理论上每秒钟最多可以从网上下载多少 M B \mathrm{MB} MB 的内容。

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


25


#include <stdio.h>

int main() {
   
    printf("%d", 200 / 8);
}

   p s \mathrm{ps} ps 意为 p e r   s e c o n d \mathrm{per\ second} per second 1 B = 8 b 1\mathrm{B} = 8\mathrm{b} 1B=8b


试题 C: 纯质数

本题总分: 10 10 10


【问题描述】

  如果一个正整数只有 1 1 1 和它本身两个约数,则称为一个质数(又称素数)。

  前几个质数是 : : 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , ⋯ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,\cdots 2,3,5,7,11,13,17,19,23,29,31,37,

  如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如 : : 2 , 3 , 5 , 7 , 23 , 37 2, 3, 5, 7, 23, 37 2,3,5,7,23,37 都是纯质数,而 11 , 13 , 17 , 19 , 29 , 31 11, 13, 17, 19, 29, 31 11,13,17,19,29,31 不是纯质数。当然 1 , 4 , 35 1, 4, 35 1,4,35 也不是纯质数。

  请问,在 1 1 1 20210605 20210605 20210605 中,有多少个纯质数?

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


1903


#include <stdio.h>

const int N = 20210605;

int ans, composite[N + 1];

int check(int n) {
   
    if (n < 10) return n == 2 || n == 3 || n == 5 || n == 7;
    do
        if (!check(n % 10)) return 0;
    while (n /= 10);
    return 1;
}

int main() {
   
    for (int i = 2; i <= N; ++i)
        if (!composite[i]) {
   
            for (int j = i + i; j <= N; j += i) composite[j] = 1;
            if (check(i)) ++ans;
        }
    printf("%d", ans);
}

  埃拉托色尼筛选法。


试题 D: 完全日期

本题总分: 10 10 10


【问题描述】

  如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。

  例如 : : 2021 2021 2021 6 6 6 5 5 5 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 5 = 16 2 + 0 + 2 + 1 + 6 + 5 = 16 2+0+2+1+6+5=16,而 16 16 16 是一个完全平方数,它是 4 4 4 的平方。所以 2021 2021 2021 6 6 6 5 5 5 日是一个完全日期。

  例如 : : 2021 2021 2021 6 6 6 23 23 23 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 2 + 3 = 16 2 + 0 + 2 + 1 + 6 + 2 + 3 = 16 2+0+2+1+6+2+3=16,是一个完全平方数。所以 2021 2021 2021 6 6 6 23 23 23 日也是一个完全日期。

  请问,从 2001 2001 2001 1 1 1 1 1 1 日到 2021 2021 2021 12 12 12 31 31 31 日中,一共有多少个完全日期?

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


977


#include <stdio.h>

int ans, days[]{
   0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int is_leap(int year) {
    return !(year % 100 ? year % 4 : year % 400); }

int calc(int n) {
   
    int res = 0;
    do
        res += n % 10;
    while (n /= 10);
    return res;
}

int check(int n) {
   
    switch (n) {
   
        case 1:
        case 4:
        case 9:
        case 16:
        case 25:
        case 36: return 1;
    }
    return 0;
}

int main() {
   
    for (int year = 2001; year <= 2021; ++year)
        for (int month = 1; month <= 12; ++month) {
   
            if (is_leap(year)) days[2] = 29;
            for (int day = 1; day <= days[month]; ++day)
                if (check(calc(year) + calc(month) + calc(day))) ++ans;
            days[2] = 28;
        }
    printf("%d", ans);
}

  签到 ×   4 \times\ 4 × 4


试题 E: 最小权值

本题总分: 15 15 15


【问题描述】

  对于一棵有根二叉树 T T T,小蓝定义这棵树中结点的权值 W ( T ) W(T) W(T) 如下 : :

  空子树的权值为 0 0 0

  如果一个结点 v v v 有左子树 L L L,右子树 R R R,分别有 C ( L ) C(L) C(L) C ( R ) C(R) C(R) 个结点,则 W ( v ) = 1 + 2 W ( L ) + 3 W ( R ) + ( C ( L ) ) 2 C ( R ) W(v) = 1 + 2W(L) + 3W(R) + (C(L))^2C(R) W(v)=1+2W(L)+3W(R)+(C(L))2C(R)

  树的权值定义为树的根结点的权值。

  小蓝想知道,对于一棵有 2021 2021 2021 个结点的二叉树,树的权值最小可能是多少?

【答案提交】

  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


2653631372


动态规划


#include <stdio.h>

#define min(a, b) (a < b ? a : b)

const int N = 2021;

long long dp[N + 1];

int main() {
   
    for (int i = 1; i <= N; ++i) {
   
        dp[i] = 0x3f3f3f3f3f3f3f3f;
        for (int l = 0; l < i; ++l)
            dp[i] = min(dp[i], 1 + 2 * dp[l] + 3 * dp[i - l - 1] + l * l * (i - l - 1));
    }
    printf("%lld", dp[N]);
}

  设 f i f_i fi C ( T ) = i C(T) = i C(T)=i 的有根二叉树 T T T 的最小权值,显然 f i f_i fi 无后效性,故考虑动态规划,有转移方程 : : f i = min ⁡ ( 1 + 2 f l + 3 f r + l 2 r ) , i = l + r + 1 , l , r ∈ N f_i = \min(1 + 2f_l + 3 f_r + l^2r),\quad i = l + r + 1,\quad l,r \in \mathbb N fi=min(1+2fl+3fr+l2r),i=l+r+1,l,rN  初始时 f 0 = 0 f_0 = 0 f0=0,答案为 f 2021 f_{2021} f2021


试题 F: 大写

时间限制: 1.0 s 1.0\mathrm s 1.0s 内存限制: 256.0 M B 256.0\mathrm{MB} 256.0MB 本题总分: 15 15 15


【问题描述】

  给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母转换成大写字母后将字符串输出。

【输入格式】

  输入一行包含一个字符串。

【输出格式】

  输出转换成大写后的字符串。

【样例输入】

LanQiao

【样例输出】

LANQIAO

【评测用例规模与约定】

  对于所有评测用例,字符串的长度不超过 100 100 100


#include <stdio.h>

#define upper(a) a >= 'a' && a <= 'z' ? a - 0x20 : a

int main() {
   
    for (int a; ~(a = getchar());) putchar(upper(a));
}

  签到 ×   6 \times\ 6 × 6,几个常用的 A S C I I \mathrm{ASCII} ASCII 码 需要记住,

  像 0 0 0 对应 0 x 30 0\mathrm x30 0x30 A \mathrm A A 对应 0 x 41 0\mathrm x41 0x41 a \mathrm a a 对应 0 x 61 0\mathrm x61 0x61

  且数字字母字符在 A S C I I \mathrm{ASCII} ASCII 码 表中是自然连续的。


试题 G: 123

时间限制: 1.0 s 1.0\mathrm s 1.0s 内存限制: 256.0 M B 256.0\mathrm{MB} 256.0MB 本题总分: 20 20 20


【问题描述】

  小蓝发现了一个有趣的数列,这个数列的前几项如下 : :

   1 , 1 , 2 , 1 , 2 , 3 , 1 , 2 , 3 , 4 , ⋯ 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, \cdots 1,1,2,1,2,3,1,2,3,4,

  小蓝发现,这个数列前 1 1 1 项是整数 1 1 1,接下来 2 2 2 项是整数 1 1 1 2 2 2,接下来 3 3 3 项是整数 1 1 1 3 3 3,接下来 4 4 4 项是整数 1 1 1 4 4 4,依次类推。

  小蓝想知道,这个数列中,连续一段的和是多少。

【输入格式】

  输入的第一行包含一个整数 T T T,表示询问的个数。

  接下来 T T T 行,每行包含一组询问,其中第 i i i 行包含两个整数 l i l_i li r i r_i ri,表示询问数列中第 l i l_i li 个数到第 r i r_i ri 个数的和。

【输出格式】

  输出 T T T 行,每行包含一个整数表示对应询问的答案。

【样例输入】

3
1 1
1 3
5 8

【样例输出】

1
4
8

【评测用例规模与约定】

  对于 10 % 10\% 10% 的评测用例, 1 ≤ T ≤ 30 , 1 ≤ l i ≤ r i ≤ 100 1 ≤ T ≤ 30, 1 ≤ l_i ≤ r_i ≤ 100 1T30,1lir

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值