Codeforces1416 B. Make Them Equal(思维,构造)

题意:

在这里插入图片描述
题目保证所有数据,n的总和<=1e4。

解法:
发现操作不会改变数据的总和,因此先统计序列的总和sum,如果sum%n!=0,那么无解.
否则令ave=sum/n.

对于[2,n],考虑先将a[i]变成i的倍数,然后将a[i]全部丢给a[1],只需要2*(n-1)次操作,
考虑是否能将a[i]变成i的倍数:
由于题目保证初始情况下,a[i]>=1,因此a[1,i-1]的和>=i-1,
当a[i]%i!=0时候,只需要加上i-(a[i]%i)即可,而i-(a[i]%i)<=i-1,
因此一定能将a[i]变为i的倍数.

现在a[1]=sum,a[2,n]=0,
我们只需要依次将[2,n]全部变成ave即可,进行(n-1)次操作即可,
总共3*(n-1)次操作.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=1e4+5;
struct Node{
    int i,j,x;
};
vector<Node>ans;
int a[maxm];
int n;
void solve(){
    ans.clear();
    //
    cin>>n;
    int sum1=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum1+=a[i];
    }
    if(sum1%n){
        cout<<-1<<endl;
        return ;
    }
    int ave=sum1/n;
    for(int i=2;i<=n;i++){
        int t=a[i]%i;
        if(t)t=i-t;
        ans.push_back({1,i,t});
        a[i]+=t;
        a[1]-=t;
        ans.push_back({i,1,a[i]/i});
        a[1]+=a[i];
        a[i]=0;
    }
    for(int i=2;i<=n;i++){
        ans.push_back({1,i,ave});
        a[i]+=ave;
        a[1]-=ave;
    }
    cout<<ans.size()<<endl;
    for(auto i:ans){
        cout<<i.i<<' '<<i.j<<' '<<i.x<<endl;
    }
}
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    int T;cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值