Codeforces Round #673 (Div. 2)D. Make Them Equal
阿新 • • 發佈:2020-10-04
題意
根據題給的操作,讓你將所有的數字都變為一樣的
思路
在\(3*n\)的操作內我們去構造。
我們將所有的數先加到a[1]上,然後再去分配使每個數相等。
- 對於\(i|a[i]\)的可以直接都加到\(a[1]\)
- 對於不能整除的情況可以先給\(a[i]+(i-a[i]\%i)\),然後再進行操作一
演算法的正確性:
https://blog.csdn.net/weixin_45750972/article/details/108916458
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; int a[maxn]; struct node{ int a,b,x; }; vector<node>ans; void f(int x,int y,int z){ a[x]-=x*z; a[y]+=x*z; ans.push_back({x,y,z}); } void solve(){ int n,sum=0;cin>>n; for(int i=1;i<=n;++i)cin>>a[i],sum+=a[i]; if(sum%n)puts("-1"); else{ ans.clear(); for(int i=2;i<=n;++i){ if(a[i]%i)f(1,i,i-a[i]%i); f(i,1,a[i]/i); } for(int i=2;i<=n;++i)f(1,i,sum/n); cout<<ans.size()<<endl; for(auto i:ans){ cout<<i.a<<" "<<i.b<<" "<<i.x<<endl; } } } signed main(){ int t;cin>>t; while(t--){ solve(); } }