第十四届蓝桥杯青少组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;
}
相关推荐
2401_892070981 天前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
yuzhuanhei1 天前
Visual Studio 配置C++opencv
c++·学习·visual studio
小O的算法实验室1 天前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
一轮弯弯的明月1 天前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
不爱吃炸鸡柳1 天前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发1 天前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
STL 栈 队列
开发语言·c++
2401_892070981 天前
【Linux C++ 日志系统实战】高性能文件写入 AppendFile 核心方法解析
linux·c++·日志系统·文件写对象
郭涤生1 天前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿1 天前
vector
c语言·开发语言·数据结构·c++·算法