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

相关推荐
kyle~几秒前
C++_STL---迭代器失效
开发语言·c++
wuminyu1 小时前
深入剖析 Panama Off-heap 的性能损耗与开销
java·linux·c语言·jvm·c++
维克兜率天1 小时前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法
rhythm-ring2 小时前
宏定义续行符 \ 的使用与踩坑
c语言·c++
AI情绪识别开源2 小时前
检信 AI 智能推广平台(代号:JX-Promote)
人工智能·算法·erlang
老当益壮梁奶奶3 小时前
Linux软件编程学习笔记(八):进程间通信详解(1)
linux·c语言·笔记·学习·算法
江安下小雨3 小时前
muduo网络库(十六):新增连接池模块
网络·c++
「QT(C++)开发工程师」3 小时前
C++11 std::unique_ptr — 独占所有权的智能指针
c语言·开发语言·c++·qt
不会就选b3 小时前
算法日常・每日刷题--<BFS拓扑排序>4
算法
不正经学生3 小时前
C语言动态内存管理(上):堆上的自由与责任
c语言·开发语言·c++·算法·面试