均分纸牌

发布时间 2023-12-17 09:11:51作者: gHoTi
 [洛谷 P1031](https://www.luogu.com.cn/problem/P1031)  [ybt 1320](http://ybt.ssoier.cn:8088/problem_show.php?pid=1320)

有 $N$ 堆纸牌,总数为 $N$ 的倍数
左右拿的操作可以看成一种,不妨规定从游戏向左拿视为正方向,则从左向右为负增加,不拿为0

最好的情况是**相邻两堆纸牌之间只拿一次**,在这种情况下,最大次数为 $N-1$ 次

我们使用类似**前缀和**的搜索方式,(因为规定从右向左)从一号牌堆向右搜索

对于任意牌堆 $i$, 若牌堆 $1$ ~ $i$ 的总牌数没有达到平均数 $*i$,则必然至少需要拿一次

**从一号牌堆开始**:若一号没有达到平均数,则必然需要二号牌堆向左拿一次,以达到一号自洽

**继续向后推进**:对于每个从1到i牌堆组成的小系统,若其本身不自洽(即上面提到),则需要外界牌堆向内补充以达到自洽。

同时由于从左向右扫,所以可以确保已经走过且未自洽的系统已经被计算且已经被处理

$n$ 号没有必要扫,所以循环从1到n-1

代码如下

```cpp
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=109;
int n,a[N],c[N],s,ans;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        s+=a[i],c[i]=c[i-1]+a[i];
    }
    s/=n;
    for(int i=1;i<n;i++)
        if(s*i!=c[i])ans++;
    cout<<ans;
    return 0;
}

```