洛谷

题意:给n堆石头,每相邻的两堆石头可以互换石头,现在问你最少要几次才能够,把每堆石头的个数都变为相同。

思路:一开始,发现了相邻的石头交换多次肯定不如一次把所有前面需要的石头都加在一堆石头上,最后一次,直接把所有石头一次性加到前面的堆,这样大大减少了次数。但是没想到和前缀和有啥关系,所以就跑去想怎么交换石头的数量了,挺复杂。其实既然要满足最优方案,最多只交换一次,那么这样就看两堆石头换不换就可以了,何必去看啥石头数量啦,本质是交换次数吖。

证明最优方案:相邻的石头交换多次肯定不如一次把所有前面需要的石头都加在一堆石头上,最后一次,直接把所有石头一次性加到前面的堆。

#include<bits/stdc++.h>
using namespace  std;

int c[110],ave;
int n;
int  main()
{
    scanf("%d",&n);
    int x;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        c[i]=c[i-1]+x;
    }

    ave=c[n]/n;
    int ans;
    ans=0;
    for(int i=1;i<=n;i++)
        if(ave*i!=c[i]) ans++;

    cout<<ans;

    return 0;
}
原文地址:https://www.cnblogs.com/rainyskywx/p/10960732.html