第十四届蓝桥杯青少组C++选拔赛[2023.1.15]第二部分编程题(4 、移动石子)

参考程序1:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main() {
    int N;
    cin >> N;
    vector<int> stones(N);
    int sum = 0;
    for (int i = 0; i < N; i++) {
        cin >> stones[i];
        sum += stones[i];
    }
    int target = sum / N; // 每个篮子的平均值
    int answer = INT_MAX; // 最终最小搬运次数
    // 枚举所有可能的起点
    for (int start = 0; start < N; start++) {
        // 把圆圈旋转,使 start 位置当作起点
        vector<int> rotated(N);
        for (int i = 0; i < N; i++) {
            rotated[i] = stones[(start + i) % N];
        }
        int moves = 0;
        vector<int> temp = rotated;
        // 按线性方式从左到右转移石子
        for (int i = 0; i < N - 1; i++) {
            int diff = temp[i] - target; 
            temp[i + 1] += diff;        
            moves += abs(diff);        
        }
        // 更新最小值
        answer = min(answer, moves);
    }
    cout << answer << endl;
    return 0;
}

参考程序2:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; // 或者 using ll = long long;

int main() {
    int N;
    cin >> N;
    vector<ll> a(N);
    ll sum = 0;
    for (int i = 0; i < N; ++i) {
        cin >> a[i];
        sum += a[i];
    }

    ll target = sum / N;

    // 构造前缀欠账 S,包含 S0 = 0,一共 N 个值 S[0..N-1]
    vector<ll> S(N);
    S[0] = 0;
    for (int i = 1; i < N; ++i) {
        S[i] = S[i-1] + (a[i-1] - target);
    }

    // 找中位数(使用排序后直接取中间值)
    vector<ll> tmp = S;
    sort(tmp.begin(), tmp.end());
    ll median = tmp[N/2];

    // 计算最小步数:sum |S[i] - median|
    ll moves = 0;
    for (ll x : S) moves += llabs(x - median);

    cout << moves << '\n';
    return 0;
}
相关推荐
念何架构之路1 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星1 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
小小编程路1 小时前
C++ 多线程与并发
java·jvm·c++
失去的青春---夕阳下的奔跑1 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光2 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩2 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_629494732 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表
程序leo源2 小时前
Qt窗口详解
开发语言·数据库·c++·qt·青少年编程·c#
zh_xuan3 小时前
解决VS Code 控制台中文乱码
c++·vscode·乱码
郭涤生3 小时前
飞凌 RK3588 开发板同显 / 异显模式切换
c++·rk3588