第十四届蓝桥杯青少组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;
}
相关推荐
Athenaand2 小时前
代码随想录算法训练营第62天 | Floyd 算法精讲、A * 算法精讲 (A star算法)、最短路算法总结篇、图论总结
算法·图论
qq_433554543 小时前
C++ Dijkstra堆优化算法
开发语言·c++·算法
UrSpecial3 小时前
Linux线程同步与互斥
linux·开发语言·c++
楼田莉子4 小时前
C++动态规划算法:斐波那契数列模型
c++·学习·算法·动态规划
1373i4 小时前
【Python】通俗理解反向传播
深度学习·算法·机器学习
Madison-No74 小时前
【C++】日期类运算符重载实战
c++·算法
椰子今天很可爱4 小时前
线程分离和线程同步互斥
linux·c++
cici158745 小时前
基于K-SVD的稀疏编码去噪算法
算法
电力程序小学童5 小时前
基于密集型复杂城市场景下求解无人机三维路径规划的Q-learning算法研究(matlab)
算法·matlab·无人机