簡單貪心題。
如果每個數相等時的數為sum,考慮一個數不等於sum,最好的情況透過一次轉移使它變為sum。
所以按順序處理,當前數少從後面拿,當前數多向後面扔,中間記錄次數即可。
考慮正確性,有人會覺得,如果後面的數不夠拿成為了負數,需要從更後面拿,就不止一次轉移了。
其實,如果遇到上述情況,可以先做後面的數從更後面拿數的操作,再做當前數拿數操作,這樣操作總數不變。
由此可證,只要不等於sum,拿一次就好了。
#include <bits/stdc++.h> using namespace std; int n,a[110],sum,ans; int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]),sum+=a[i]; sum/=n; for(int i=1;i<=n;i++) { if(a[i]>sum) ans++,a[i+1]+=a[i]-sum; else if(a[i]<sum) ans++,a[i+1]-=(sum-a[i]); } printf("%d",ans); return 0; }