第十四届蓝桥杯青少组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;
}
相关推荐
菜菜小狗的学习笔记2 分钟前
剑指Offer算法题(四)链表
数据结构·算法·链表
myloveasuka6 分钟前
[Java]查找算法&排序算法
java·算法·排序算法
清水白石00814 分钟前
Free-Threaded Python 实战指南:机遇、风险与 PoC 验证方案
java·python·算法
We་ct14 分钟前
LeetCode 148. 排序链表:归并排序详解
前端·数据结构·算法·leetcode·链表·typescript·排序算法
wWYy.18 分钟前
STL:list
开发语言·c++
小比特_蓝光1 小时前
vector模拟实现
c++
本喵是FW1 小时前
C语言手记1
java·c语言·算法
咱就是说不配啊1 小时前
3.19打卡day33
数据结构·c++·算法
2501_924952691 小时前
嵌入式C++电源管理
开发语言·c++·算法
2401_842623651 小时前
C++中的访问者模式高级应用
开发语言·c++·算法