RQNOJ 62 [NOIP2002]均分纸牌

RQNOJ_62

    我们可以将牌在相邻堆之间的移动想象成经过了一条边,那么任意两堆相邻的牌之间都会有一条边,而且在最优情况下每条边应当是至多经过一次的,如果超过一次的话也可以通过相消变成至多经过一次。那么如何确定一条边要不要被走呢?实际上对于任意一条边来讲,都将牌划分成了左右两部分,如果两部分各自内部不能平衡的话就会通过这条边来达到平衡的目的。这样扫一遍前缀和就可以判定有多少条边需要经过了,而经过的边的数量就是最后的结果。至于可行性,由于最后需要经过的边都是有向的,所以会形成一个有向图,按有向图的方向移动牌即可。

#include<stdio.h>
#include<string.h>
#define MAXD 110
int N, a[MAXD];
void solve()
{
    int s = 0, n, cnt = 0;
    for(int i = 1; i <= N; i ++)
        scanf("%d", &a[i]), s += a[i];
    n = s / N;
    s = 0;
    for(int i = 1; i <= N; i ++)
    {
        s += a[i];
        cnt += s != n * i;
    }
    printf("%d\n", cnt);
}
int main()
{
    while(scanf("%d", &N) == 1)
        solve();    
    return 0;    
}
原文地址:https://www.cnblogs.com/staginner/p/2712378.html