#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int main() {
int n;
int a[10000];
int ans = 0;
int avg;
int sum = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
sum += a[i];
}
avg = sum / n;
for (int i = 0; i < n; i++)
{
a[i] -= avg;
}
for (int i = 0; i < n-1; i++)
{
if (a[i] == 0) {
continue;
}
else {
a[i + 1] += a[i];
ans++;
}
}
cout << ans;
}
分析:
①由於題意,最左邊的牌堆只能從第二個牌堆取牌,所以由貪心思想,將第一個牌堆看作一個牌堆,後面剩餘的所有牌堆看作一個大牌堆,每次直接將第一個牌堆補至平均值。
②補至上限後,則不用管它了,把它分離出去,第二個牌堆成爲第一個牌堆,後面的所有牌堆成爲下一個大牌堆
③過程中會出現牌的數量小於0的情況下,即後面的牌堆的還欠着前面的帳。
深入分析:這是一種可逆思想,其實一直往後是求出該位置究竟要跟其後面的位置交換多少張牌