cf3

1.Codeforces Round #673 (Div. 2) D. Make Them Equal

 

 

 

 大意:给出一个n个数的数组,你最多可以执行3*n次以下操作:选择三个整数 i,j,x,使a[ i ] = a[ i ] - x * i ,a[ j ] = a[ j ] + x * i 。操作完成后,能否使得这n个数相等 ?

 题解:注意到 x 是可以任选的,那么当 i = 1 时,i*x 可以选择到任意整数,那么可以将 a[ 2 ] .... a[ n ] 的值全部集中到 a[ 1 ]上,再由 a[ 1 ]分配给它们。

#include<bits/stdc++.h>
using namespace std;
#define ll long long

const int maxn=3e4+50;

int T,n,a[maxn],sum,t,ans1[maxn],ans2[maxn],ans3[maxn];

template<typename T>void inline read(T &aa){
    ll ff=1;char cc=getchar();aa=0;
    while((cc<'0'||cc>'9')&&cc!='-') cc=getchar();
    if(cc=='-') ff=-1,cc=getchar();
    while(cc<='9'&&cc>='0') aa=aa*10+cc-48,cc=getchar();
    aa*=ff;
}

int main(){
    read(T);
    while(T--){
        read(n); sum=0; t=0;
        for(int i=1;i<=n;i++){
            read(a[i]); sum+=a[i];
        }
        if(sum%n){
            cout<<-1<<endl; continue;
        }
        int aver=sum/n;bool p=0;
        for(int i=2;i<=n;i++){
            if(a[i]/i==0){
                int x=i-a[i];
                if(a[1]<x){
                    p=1; break;
                }
                ans1[++t]=1; ans2[t]=i; ans3[t]=x; a[1]-=x;
                ans1[++t]=i; ans2[t]=1; ans3[t]=1; a[1]+=i; a[i]=0; continue;
            }
            if(a[i]%i==0){
                int x=a[i]/i;
                ans1[++t]=i; ans2[t]=1; ans3[t]=x; a[1]+=x*i; a[i]=0; continue;
            }
            int x=a[i]/i; x++;
            int xx=i*x-a[i];
            if(a[1]<xx){
                p=1; break;
            }
            ans1[++t]=1; ans2[t]=i; ans3[t]=xx; a[1]-=xx;
            ans1[++t]=i; ans2[t]=1; ans3[t]=x; a[1]+=x*i; a[i]=0;
        }
        if(p){
            cout<<-1<<endl; continue;
        }
        for(int i=2;i<=n;i++){
            int x=aver-a[i];
            if(x==0) continue;
            ans1[++t]=1; ans2[t]=i; ans3[t]=x;
        }
        cout<<t<<endl;
        for(int i=1;i<=t;i++){
            cout<<ans1[i]<<" "<<ans2[i]<<" "<<ans3[i]<<endl;
        }
    }
    return 0;
}
View Code

 

posted @ 2021-09-16 22:25  rld  阅读(209)  评论(0编辑  收藏  举报