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;
}

相关推荐
感哥3 小时前
C++ 面向对象
c++
CoovallyAIHub4 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
沐怡旸4 小时前
【底层机制】std::shared_ptr解决的痛点?是什么?如何实现?如何正确用?
c++·面试
NAGNIP5 小时前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo5 小时前
半开区间和开区间的两个二分模版
算法
moonlifesudo5 小时前
300:最长递增子序列
算法
CoovallyAIHub10 小时前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
感哥10 小时前
C++ STL 常用算法
c++
CoovallyAIHub11 小时前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
saltymilk21 小时前
C++ 模板参数推导问题小记(模板类的模板构造函数)
c++·模板元编程