[洛谷 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;
}
```