//每一堆牌只会受相邻的牌影响,因此从左开始,每一堆牌为了达到平均值,就得向右边的牌索取(或给予),并且步数+1
//于是这堆达到平均值的牌就可以当做已经不存在,继续处理接下来的牌
#include <iostream>
using namespace std;
const int N = 110;
int a[N];
int n , total;
int ans;
int main()
{
cin >> n;
for(int i = 1 ; i <= n ; i++) cin >> a[i] , total += a[i];
int avg = total / n;
for(int i = 1 ; i <= n ; i++)
if(a[i] != avg) a[i + 1] += a[i] - avg , ans++;
cout << ans << endl;
return 0;
}
每个牌堆的纸牌数不能为负数,这个解法是怎么保证这一点的?
纸牌为负数肯定不能达到平均值,那么这对牌一定得向右继续拿牌,可调整顺序这样这堆牌就不会出现纸牌为负。实际处理并不一定是从左往右。
好清晰的思路,悟了
想听证明$QwQ$
找到了别人的详细分析
https://mp.weixin.qq.com/s?__biz=MzA3NDQwMDUxMg==&mid=2651479098&idx=4&sn=5e8ee97fec88d1dd04eafdd8091ec961&chksm=84feaa55b38923438256db0124c69f1ef71f13a7c2a36612c5e9a38101b1e35a29e6279c15a8&scene=27
妙蛙,考虑平均数为判断条件
写的很好!
还是不太懂,为啥不会是两边同时给我,或者我给出达到平均?
、
其实两边同时给的情况是考虑到了的,因为a[i]-avg仅表示相差的量,正负号是有方向的,他的正负号是向右给予和向右索取,所以尽管是顺序的,但还是都考虑进去了的
哦我懂了,Thanks♪(・ω・)ノ