参考https://ac.nowcoder.com/acm/problem/16739 均分纸牌
均分纸牌这道题是移动纸牌,就相当于相邻的两堆一堆+1,一堆-1,就是此题了。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define f(i,a,b) for(int i=a;i<=b;i++) inline ll r() { ll x=0,f=1; char c=getchar(); while(!isdigit(c)){if(c=='-')f=-1;c=getchar();} while(isdigit(c))x=x*10+c-'0',c=getchar(); return x*f; } #define d r() ll t; ll n; ll a[100010]; int main(){ t=d; while(t--){ n=d; ll sum=0,ans=0; f(i,1,n)a[i]=d,sum+=a[i]; if(sum%n){ cout<<-1<<endl; continue; } sum/=n; f(i,1,n)ans+=abs(sum-a[i]),a[i+1]-=sum-a[i]; printf("%lld\n",ans); } return 0; }