第十六届蓝桥杯软件校模拟赛C/CPP部分试题代码

前言

第一次做蓝桥杯模拟题 代码可能不是最优解 欢迎指正

至于为什么是部分试题代码 因为有3个不会做🌚🌚🌚

问题1(填空题)

【问题描述】
如果一个数 p 是个质数,同时又是整数 a 的约数,则 p 称为 a 的一个质因数。

请问, 2024 的最大的质因数是多少?

代码↓

#include<stdio.h>
int main()
{
    int n = 2024;
    int i = 0;
    for (i = 2; i <= n; i++)
    {
        while (n % i == 0)
        {
            n /= i;
            if (n == 1)
            {
                printf("%d\n", i);
                break;
            }
        }
    }
    return 0;
}

问题2(填空题)

两个数按位异或是指将这两个数转换成二进制后,最低位与最低位异或作为结果的最低位,次低位与次低位异或作为结果的次低位,以此类推。

例如,3 与 5 按位异或值为 6 。

请问,有多少个不超过 2024 的正整数,与 2024 异或后结果小于 2024 

代码↓

#include<stdio.h>
int main()
{
    int a = 2024;
    int i = 0;
    int count = 0;
    for (i = 1; i <= 2024; i++)
    {
        int b = i ^ a;
        if (b < 2024)
        {

            count++;

        }

    }
    printf("%d ", count);

    return 0;
}

问题3(填空题)

求2024与1024的最小公倍数

代码↓

#include<stdio.h>
int main()
{
    int a = 2024;
    int b = 1024;
    for (int i = 2024; ; i++)
    {
        if (i % a == 0 && i % b == 0)
        {
            printf("最小公倍数为:%d", i);
            break;
        }

    }
    return 0;
}

问题4(编程题)

小蓝准备请自己的朋友吃饭。小蓝朋友很多,最终吃饭的人总数达 2024 人(包括他自己)。
请问如果每桌最多坐 n 人,最少要多少桌才能保证每个人都能吃饭。

代码↓

#include<stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    int a = 2024 / n;
    int b = 2024 % n;
    if (b == 0)
    {
        printf("%d", a);

    }
    else if (b != 0)
    {
        a = a + 1;
        printf("%d", a);
    }

    return 0;
}

问题5(编程题)

【问题描述】
小蓝有一个数组 a[1], a[2], ..., a[n] ,请求出数组中值最小的偶数,输出这个值。

【输入格式】
输入的第一行包含一个整数 n 。

第二行包含 n 个整数,相邻数之间使用一个空格分隔,依次表示 a[1], a[2], ..., a[n] 。

【输出格式】
输出一行,包含一个整数,表示答案。数据保证数组中至少有一个偶数。

【样例输入】
9
9 9 8 2 4 4 3 5 3
【样例输出】
2  

代码↓

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n = 0;
    int arr[1000];
    // 读取数组元素个数
    scanf("%d", &n);
    // 读取数组元素
    for (int i = 1; i < n; i++)
    {
        scanf("%d ", &arr[i]);
    }
    int min = 1000000;  // 先初始化一个较大值,用于比较找出最小偶数
    for (int i = 1; i < n; i++)
    {
        if (arr[i] % 2 == 0 && arr[i] < min)
        {
            int min = arr[i];
        }
    }
    printf("%d\n", min);
    return 0;
}

问题6(编程题)

一个字符串包含LANQIAO是指在字符串中能取出几个字符,将他们按照在原串中的位置顺序摆成一排后字符串为 LANQIAO 。即字符串包含 LANQIAO 是指 LANQIAO 是这个串的子序列。
例如:LLLLLANHAHAHAQLANIIIIALANO 中包含 LANQIAO 。
又如:OAIQNAL 中不包含 LANQIAO 。
给点一个字符串,判断字符串中是否包含 LANQIAO 。
【输入格式】
输入一行包含一个字符串。
【输出格式】


如果包含 LANQIAO ,输出一个英文单词 YES ,否则输出一个英文单词 NO 。
【样例输入】
LLLLLANHAHAHAQLANIIIIALANO
【样例输出】
YES
【样例输入】
OAIQNAL
【样例输出】
NO
【评测用例规模与约定】
对于所有评测用例,输入的字符串非空串,由大写字母组成,长度不超过 1000 

代码↓

#include<stdio.h>
#include<string.h>
int main()
{
    char arr[1000] = { 0 };
    scanf("%s", arr);
    int i = 0;
    int sz = strlen(arr);
    int count = 0;
    for (i = 0; i < sz; i++)
    {
        if (arr[i] == "LANQIAO"[count])
        {
            count++;
        }

        if (count == 7)
        {
            printf("YES");
        }
    }
   if(count != 7)
       printf("NO");
    return 0;
}

问题7(编程题)

小蓝有一个 n 行 m 列的矩阵 a[i][j] ,他想在矩阵中找出一个“口”字形状的区域,使得区域上的值的和最大。

具体讲,一个“口”字形状的区域可以由两个坐标 (x1, y1) 和 (x2, y2) 确定,满足:

1 <= x1 < x2 <= n ;
1 <= y1 < y2 <= m ;
x2 - x1 = y2 - y1 。
对应的区域由满足以下条件之一的点 (x, y) 构成:

x1 <= x <= x2,且 y = y1 ,对应“口”的左边一竖;
y1 <= y <= y2,且 x = x1 ,对应“口”的上面一横;
x1 <= x <= x2,且 y = y2 ,对应“口”的右边一竖;
y1 <= y <= y2,且 x = x2 ,对应“口”的下面一横.
请注意有些点满足以上条件的多个,例如左上角的点 (x1, y1) ,在计算时算为一个点。
区域上的值是指对应区域的所有点的值,即“口”字的框上的值,不含框内和框外的值。
【输入格式】
输入的第一行包含两个整数 n, m ,分别表示行数和列数。
接下来 n 行,每行包含 m 个整数,相邻数之间使用一个空格分隔,依次表示矩阵的每行每列的值,本部分的第 i 行第 j 列表示 a[i][j] 。
【输出格式】
输出一行包含一个整数,表示最大的和。
【样例输入】
5 6
1 -1 2 -2 3 -3
-1 2 -2 3 -3 4
2 -2 3 -3 4 -4
-2 3 -3 4 -4 5
3 -3 4 -4 5 -5
【样例输出】

4

代码↓

#include<stdio.h>
int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int arr[100][100] = { 0 };
    int i = 0;
    int j = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            scanf("%d", &arr[i][j]);
        }
    }
    int max = -9999999999;
    int sum = 0;
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < m - 1; j++)
        {
            sum = arr[i][j] + arr[i + 1][j] + arr[i][j + 1] + arr[i + 1][j + 1];
            if (sum > max)
            {
                max = sum;
            }
        }
    }
    printf("%d", max);

    return 0;
}

两道不会做的题目↓

问题8(填空)

小蓝有以下 100 个整数:

534, 386, 319, 692, 169, 338, 521, 713, 640, 692, 969, 362, 311, 349, 308, 357, 515, 140, 591, 216,

57, 252, 575, 630, 95, 274, 328, 614, 18, 605, 17, 980, 166, 112, 997, 37, 584, 64, 442, 495,

821, 459, 453, 597, 187, 734, 827, 950, 679, 78, 769, 661, 452, 983, 356, 217, 394, 342, 697, 878,

475, 250, 468, 33, 966, 742, 436, 343, 255, 944, 588, 734, 540, 508, 779, 881, 153, 928, 764, 703,

459, 840, 949, 500, 648, 163, 547, 780, 749, 132, 546, 199, 701, 448, 265, 263, 87, 45, 828, 634.

小蓝想从中选出一部分数求和,使得和是 24 的倍数,请问这个和最大是多少?

问题9(填空)

小蓝可以花费 3 的代价将整数增加一个值,这个值是整数的数位中最大的那个(1 到 9)。
小蓝可以花费 10 的代价将整数变为原来的 2 倍。
例如,如果整数为 16,花费 3 将整数变为 22 。
又如,如果整数为 22,花费 1 将整数变为 23 。
又如,如果整数为 23,花费 10 将整数变为 46 。
请问,如果要将整数从初始值 1 变为 2024,请问最少需要多少代价?

问题10(编程题)

【问题描述】
小蓝正在玩一个寻宝游戏。寻宝游戏在一个方格图上进行。方格图中的每一个格子都有一个坐标 (r, c),其中越往北 r 越小,越往南 r 越大,越往东 c 越大,越往西 c 越小。南北相邻方格的 c 坐标相同,r 坐标差一。东西相邻方格的 r 坐标相同, c 坐标差一。
游戏开始时,小蓝站在 (0, 0) 处,面向北边。游戏区域无限大,且没有障碍。每一步,小蓝控制自己的角色走一步,他可以有如下三种选择:
向前走:朝现在的方向前进到相邻的方格中,并保持当前的方向。
向左走:向左转90度,并前进到相邻的方格中(即进入到原来左边的方格),面向的方向变为了原来的左边。
向右走:向右转90度,并前进到相邻的方格中(即进入到原来右边的方格),面向的方向变为了原来的右边。
小蓝玩了一会儿,一共走了 n 步,他记录了自己的每一个动作。但是他没有找到宝藏。他怀疑前面的某一步出现了失误。他想知道,如果他改变之前的某一步,能到的位置有哪些。由于这个太复杂,他想知道最终到的位置(第 n 步后到的位置)有多少种。
【输入格式】
输入的第一行包含一个整数 n ,表示小蓝走了 n 步。
第二行包含一个长度为 n 的由大写字母组成的字符串,依次表示小蓝走的每一步。字母 F 、 L 、 R 分别表示对应的步是向前走、向左走、向右走。
【输出格式】
输出一行,包含一个整数,表示如果改变某一步,可以到的位置的种类数。
【样例输入】
3
FLR【样例输出】
6【样例说明】
如果不改变,三步依次走到:(-1, 0), (-1, -1), (-2, -1) ,最终位置为 (-2, -1) 。
如果第一步改成 L,三步依次走到:(0, -1), (1, -1), (1, -2) ,最终位置为 (1, -2) 。
如果第一步改成 R,三步依次走到:(0, 1), (-1, 1), (-1, 2) ,最终位置为 (-1, 2) 。
如果第二步改成 F,三步依次走到:(-1, 0), (-2, 0), (-2, 1) ,最终位置为 (-2, 1) 。
如果第二步改成 R,三步依次走到:(-1, 0), (-1, 1), (0, 1) ,最终位置为 (0, 1) 。
如果第三步改成 F,三步依次走到:(-1, 0), (-1, -1), (-1, -2) ,最终位置为 (-1, -2) 。
如果第三步改成 L,三步依次走到:(-1, 0), (-1, -1), (0, -1) ,最终位置为 (0, -1) 。
共有 6 种不同的最终位置。
【样例输入】
4
RRRR【样例输出】
6【样例说明】
有 8 种改变方法:
改为 FRRR ,最终位置为 (0, 0);
改为 LRRR ,最终位置为 (0, 0);
改为 RFRR ,最终位置为 (1, 1);
改为 RLRR ,最终位置为 (0, 2);
改为 RRFR ,最终位置为 (2, 0);
改为 RRLR ,最终位置为 (2, 2);
改为 RRRF ,最终位置为 (1, -1);
改为 RRRL ,最终位置为 (2, 0)。
不同的最终位置共有 6 种。
【评测用例规模与约定】
对于 30% 的评测用例,1 <= n <= 20。
对于 60% 的评测用例,1 <= n <= 1000。
对于所有评测用例,1 <= n <= 100000。

这两道题目等我再想想吧 读者也可以做做提升自己

接下来说一下感受吧

当然这些都是算法题 难的确实难 简单的也是挺简单的 我觉得大部分题的难度不是在于代码有多难写 而是读题干的能力 题干读懂了 相信能写出代码也不是什么阻碍

当然还是有些逻辑还是要思考的

看一下校排名成绩吧

应该有一二百人参加

055b4e012ab748cb91f3d8640a027fbf.png

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值