P1031 [NOIP2002 提高組] 均分紙牌

storms11發表於2024-07-17

簡單貪心題。

如果每個數相等時的數為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;
}

相關文章