> 文章列表 > B. Make Them Equal(Codeforces Round 673 (Div. 1))

B. Make Them Equal(Codeforces Round 673 (Div. 1))

B. Make Them Equal(Codeforces Round 673 (Div. 1))

传送门

题意:

思路:

首先判断是否能够操作达到目的:即所有的数都相等。

不能达到有两种情况:

        1:所有数之和对n取余不等于0

        2:   每个ai都是小于i的,例如n=5, a[]={0,1,2,3,4}。因为每个数都是小于 i 的,所以不能进行有效操作。

以上是输出-1的情况。\\left ( i,1,ai/i \\right )

然后:操作次数0\\leqslant k\\leqslant 3*n是需要考虑的,也就是每个ai最多操作3次。,所以我们让所有除了a1的数都进行3次操作。如果不需要操作,我们就输出无关的操作,废物操作。也就是操作后转移0,例如:4 1 0,5 1 0,这种的。

大致想一下,我们可以把所有的数全部转移到a[1]。然后最后把a1向ai进行操作就行了。

        \\blacklozenge如果一个ai%i==0,那么只需要一次操作就能全部转移到a1。然后添加一个无关操作(1,1,0)。

        \\blacklozenge如果ai%i\\neq 0,那么我们先让a1对ai进行补数,达到ai%i==0,这样包含一个操作\\left ( 1, i,i-ai%i \\right ),然后再进行操作:把ai转移到a1\\left ( i ,1 ,ai/i \\right )。 

这样最后达到了数组是 {sum,0,0,0...};

然后对每个ai进行补数(sum/n),就行了。这样会发现刚好凑成了(n-1)*3次操作。

AC代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10; 
int a[N];
void solve(){int n;cin>>n;int sum=0;int flag=0;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];if(a[i]>=i){flag=1;}}if(sum%n!=0||flag==0){cout<<"-1\\n";return ;}int num=sum/n;int l=2,r=2;cout<<(n-1)*3<<"\\n";while(r<=n){if(a[r]%r==0){cout<<1<<" "<<1<<" 0"<<"\\n";}else {cout<<"1 "<<r<<" "<<r-a[r]%r<<"\\n";a[r]+=r-a[r]%r;}cout<<r<<" 1 "<<a[r]/r<<"\\n"; a[1]+=a[r];r++;}int ll=2;while(ll<=n){cout<<"1 "<<ll<<" "<<num<<"\\n";ll++;}
}
signed main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;cin>>t;while(t--){solve();}
}