大一新生备战蓝桥杯c/c++B组——2024年省赛真题解题+心得分享

发布于:2025-03-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

一,握手问题

这个题用点像小学奥数,直接手算就行

答案:1204

二,小球反弹

这个题思路简单,但是运行会显示超时。在思考思考,后续补代码。

三,好数

思路一: 

#include <iostream>
using namespace std;

bool isGoodNumber(int n) {
    for(int i = 1; n > 0; i++) // 从最低位开始,i表示当前是第几位,i++位数加1
    {
        int digit = n % 10;  // 取出当前位的数字
        if ((i % 2 == 1 && digit % 2 != 1) || (i % 2 == 0 && digit % 2 != 0)) {
            return false;  // 如果当前位不满足条件,返回false
        }
        n = n / 10;  // 去掉最低位
         // 位数加1
    }
    return true;  // 所有位都满足条件,返回true
}

int main() {
    int N;
    cin >> N;

    int count = 0;
    for (int n = 1; n <= N; n++) {
        if (isGoodNumber(n)) {
            count++;  // 如果是好数,计数器加1
        }
    }

    cout << count;
    return 0;
}

思路二:

#include <iostream>
using namespace std;

int main() {
    int N;
    cin >> N;

    int count = 0;  // 记录“好数”的数量

    for (int n = 1; n <= N; n++) {
        int temp = n;  // 使用临时变量,避免修改外层循环的 n
        bool isGood = true;  // 假设当前数字是“好数”
        int i = 1;  // 位数计数器,从最低位开始

        while (temp > 0) {
            int digit = temp % 10;  // 取出当前位的数字

            // 检查当前位是否满足条件
            if ((i % 2 == 1 && digit % 2 != 1) || (i % 2 == 0 && digit % 2 != 0)) {
                isGood = false;  // 如果某一位不满足条件,标记为不是“好数”
                break;  // 跳出内层循环
            }

            temp = temp / 10;  // 去掉最低位
            i++;  // 位数加1
        }

        if (isGood) {
            count++;  // 如果当前数字是“好数”,计数器加1
        }
    }

    cout << count;  // 输出“好数”的数量
    return 0;
}

解释代码 

  1. 临时变量 temp

    • 在内层循环中,使用 temp 来保存当前正在检查的数字,避免修改外层循环的 n

  2. 标志变量 isGood

    • 初始值为 true,假设当前数字是“好数”。

    • 如果某一位不满足条件,将 isGood 设置为 false 并跳出内层循环。

  3. 位数计数器 i

    • 从最低位开始,逐位检查数字的每一位是否满足“好数”的条件。

  4. 条件判断

    • 如果当前位是奇数位(i % 2 == 1),则检查数字是否为奇数(digit % 2 == 1)。

    • 如果当前位是偶数位(i % 2 == 0),则检查数字是否为偶数(digit % 2 == 0)。

  5. 计数

    • 如果当前数字是“好数”,则增加计数器 count

四,R格式

思路:

#include <iostream>   // 用于输入输出操作
#include <cmath>      // 提供pow()和round()数学函数
using namespace std;

int main() {
    int n;            // 转换参数n,必须是整数
    double d;         // 待转换的浮点数d,题目保证d>0
    
    // 输入处理:按顺序读取整数n和浮点数d
    cin >> n >> d;    // 示例输入:3 9.14
    
    // 计算 d * 2^n(使用pow函数计算2的n次方)
    double m = d * pow(2, n); // 示例计算:9.14 * 8 = 73.12
    
    // 四舍五入到最近的整数,使用long long避免溢出
    long long ans = round(m); // 示例结果:round(73.12) = 73
    
    // 输出最终结果
    cout << ans << endl; // 正确输出应为整数73
    
    return 0;
}

这个代码只通过了50%,我还没找到问题出在哪。

补充:C++数学库常用函数

  1. 绝对值函数用abs()函数实现
  2. 四舍五入操作用round()函数实现
  3. 计算平方根用sqrt()函数实现
  4. 计算幂次方用pow()函数实现

五,宝石组合

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

const int N = 1e5 + 1; //定义一个常数 N,,表示数组大小的上线为100001
int s[N]; //定义整数数组s,用于存储输入的宝石的闪亮度
int n; //存储宝石的数量
vector<int> d[N]; 

int main() {
    cin >> n;
//遍历0到n-1,读取宝石的闪亮度,存储到数组s中
    for (int i = 0; i < n; i++) {
        cin >> s[i];
    }
    sort(s, s + n);//对数组s中的宝石闪亮度进行升序排序
//找出数组s中每个元素的约数,将具有相同约数的数组元素vector数组 d中
    for (int i = 0; i < n; i++) {
        for (int j = 1; j <= sqrt(s[i]); j++) {
            if (s[i] % j == 0) {
                d[j].push_back(s[i]);
                if (s[i] / j != j) {
                    d[s[i] / j].push_back(s[i]);
                }
            }
        }
    }
//在存储具有相同约数的宝石闪亮度的vector数组d中,寻找第一个元素个数大于等于3的
    for (int i = N - 1; i >= 0; i--) {
        if (d[i].size() >= 3) {
            cout << d[i][0];
            for (int j = 1; j < 3; j++) {
                cout << " " << d[i][j];
            }
            break;
        }
    }
    return 0;
}

 

六,数字接龙

这道题主要用到矩阵,我还没学,这周会继续补充。 

七,爬山

八,拔河

最后两题有一点思路,但没办法完全写出来,后续会补。