2025蓝桥杯十六届C++ B组题解与代码分析

填空题解析

A. 移动距离(5分)

cpp 复制代码
#include <iostream>
#include <cmath>
using namespace std;

int main() {
    const int x = 233, y = 666;
    // 计算极坐标系半径
    const double r = hypot(x, y);
    // 计算旋转角度(弧度制)
    const double theta = atan2(y, x);
    // 总距离 = 直线移动 + 弧线移动
    const double total = r + r * theta;
    // 四舍五入取整输出
    cout << static_cast<int>(total + 0.5) << endl; // 输出1576
    return 0;
}

B. 客流量上限(5分)

cpp 复制代码
#include <iostream>
using namespace std;
const int MOD = 1e9+7;

int fast_pow(int base, int exp) {
    int res = 1;
    while (exp > 0) {
        if (exp & 1) res = 1LL * res * base % MOD;
        base = 1LL * base * base % MOD;
        exp >>= 1;
    }
    return res;
}

int main() {
    const int n = 2025;
    // 计算指数 (2025-1)/2 = 1012
    cout << fast_pow(2, (n-1)/2) << endl; // 输出781448427
    return 0;
}

编程题详解

C. 可分解的正整数(10分)

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    int n, cnt = 0;
    cin >> n;
    while (n--) {
        int x;
        cin >> x;
        // 数学结论:除1以外所有数都符合条件
        cnt += (x != 1);
    }
    cout << cnt;
    return 0;
}

D. 产值调整(10分)

cpp 复制代码
#include <iostream>
using namespace std;

void process(int& a, int& b, int& c, int k) {
    while (k--) {
        int na = (b + c) / 2;
        int nb = (a + c) / 2;
        int nc = (a + b) / 2;
        
        // 提前终止条件:数值不再变化
        if (na == a && nb == b && nc == c) break;
        
        a = na; b = nb; c = nc;
    }
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        int a, b, c, k;
        cin >> a >> b >> c >> k;
        process(a, b, c, k);
        cout << a << " " << b << " " << c << endl;
    }
    return 0;
}

E. 画展布置(15分)

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int N, M;
    cin >> N >> M;
    vector<long long> nums(N);
    for (auto& num : nums) cin >> num;
    
    // 排序后滑动窗口找最小差值
    sort(nums.begin(), nums.end());
    
    long long min_val = 1e18;
    // 窗口滑动范围[i, i+M-1]
    for (int i = 0; i <= N - M; ++i) {
        long long diff = nums[i+M-1] * nums[i+M-1] - nums[i] * nums[i];
        min_val = min(min_val, diff);
    }
    
    cout << min_val;
    return 0;
}

F. 水质检测(15分)

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
const int INF = 0x3f3f3f3f;

int main() {
    int n;
    string grid[2];
    cin >> n >> grid[0] >> grid[1];

    // dp[i][s]: 处理到第i列时状态s的最小操作数
    // s状态编码: 00 01 10 11 (二进制表示上下位置是否连通)
    vector<vector<int>> dp(n+1, vector<int>(4, INF));
    dp[0][3] = 0; // 初始状态:两行都需要连通

    for (int i = 1; i <= n; ++i) {
        // 当前列需要修改的格子数
        int cost0 = (grid[0][i-1] == '.') ? 1 : 0;
        int cost1 = (grid[1][i-1] == '.') ? 1 : 0;

        // 状态转移枚举
        for (int prev : {0,1,2,3}) {  // 前驱状态
            for (int curr : {0,1,2,3}) {  // 当前状态
                // 必须保证纵向和横向连通性
                if ((curr & prev) || (curr & (curr>>1))) {
                    int new_cost = dp[i-1][prev] + __builtin_popcount(curr) * (cost0 + cost1);
                    dp[i][curr] = min(dp[i][curr], new_cost);
                }
            }
        }
    }

    cout << *min_element(dp[n].begin(), dp[n].end());
    return 0;
}

相关推荐
Madison-No714 分钟前
【C++】探秘string的底层实现
开发语言·c++
_Power_Y14 分钟前
Java面试常用算法api速刷
java·算法·面试
艾醒(AiXing-w)15 分钟前
大模型面试题剖析:模型微调中冷启动与热启动的概念、阶段与实例解析
人工智能·深度学习·算法·语言模型·自然语言处理
天选之女wow29 分钟前
【代码随想录算法训练营——Day32】动态规划——509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯
算法·leetcode·动态规划
红衣小蛇妖37 分钟前
LeetCode-704-二分查找
java·算法·leetcode·职场和发展
rongqing201941 分钟前
问题记录:一个简单的字符串正则匹配算法引发的 CPU 告警
算法
无限进步_1 小时前
C语言字符串与内存操作函数完全指南
c语言·c++·算法
rengang661 小时前
07-逻辑回归:分析用于分类问题的逻辑回归模型及其数学原理
人工智能·算法·机器学习·分类·逻辑回归
Zzzzmo_1 小时前
【Java】杨辉三角、洗牌算法
java·数据结构·算法
闻缺陷则喜何志丹1 小时前
【C++贪心】P10537 [APIO2024] 九月|普及+
c++·算法·贪心·洛谷