交换


桝䢰䂖轤(解题思路)
相邻的位置一个 +1+1+1 一个 −1-1−1 ,那么总和还是不变的。使所有的值最后相等,自然只能是平均值。如果平均值不是整数,那仅凭 +1+1+1 −1-1−1 得出小数那就是蟠桃园结果了。然后将当前值传递给下一个,累计即可。
code
#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
ll T;
ll n,a[100010];
ll ans;
ll pj()
{
ll s=0;
for(ll i=1;i<=n;i++)
s+=a[i];
if(s%n==0)
return s/n;
return -1;
}
int main()
{
cin>>T;
while(T--)
{
cin>>n;
for(ll i=1;i<=n;i++)
scanf("%lld",&a[i]);
ll pjz=pj();
if(pjz==-1)
{
cout<<-1<<endl;
continue;
}
ans=0;
for(ll i=1;i<n;i++)
a[i+1]+=a[i]-pjz,ans+=abs(a[i]-pjz);
cout<<ans<<endl;
}
}
本文探讨了一种通过相邻位置的数值交换实现数值平均化的算法。该算法利用+1和-1的操作使得所有数值最终相等,并通过累计操作次数来解决特定问题。文章提供了完整的C++代码实现。
494

被折叠的 条评论
为什么被折叠?



