参考程序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;
}