题意:
给定一个数组,可以进行任意多次以下操作:
1.选择第i和第j个数。
2.使a[i]=a[i]/a[j](向上取整)。
不可以插入或者删减数组元素,求多少次使数组元素都相同,输出次数以及每次操作的两个下标i,j;如果无法实现输出-1.
分析:
数组中存在1一定无法实现,或者数组元素都相等直接输出0。
可以将数组排序,使数组中每一个大于最小值的数a[i]都每次与最小的数a[0]进行操作直到a[i]<=a[0],如果数组元素仍然不相同则继续重复以上步骤。
代码:
#include <bits/stdc++.h> #define endl '\n' using namespace std; typedef pair<int,int> pii; typedef long long ll; const int N=110; pii a[N]; void solve() { int t; cin>>t; while(t--) { vector<pii> ans; int n; cin>>n; for(int i=0;i<n;i++) { int x; cin>>x; a[i]={x,i+1}; } sort(a,a+n); if(a[0].first==a[n-1].first) { cout<<0<<'\n'; continue; } if(a[0].first==1) { cout<<-1<<'\n'; continue; } while(1) { int flag=0; for(int i=1;i<n;i++) { if(a[i].first>a[0].first) { flag=1; while(a[i].first>a[0].first) { if(a[i].first%a[0].first==0) a[i].first/=a[0].first; else a[i].first=a[i].first/a[0].first+1; ans.push_back({a[i].second,a[0].second}); } } } if(flag==0) break; else sort(a,a+n); } cout<<ans.size()<<'\n'; for(int i=0;i<ans.size();i++) cout<<ans[i].first<<' '<<ans[i].second<<'\n'; } } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve(); }
标签:pii,排序,Equalize,Divide,int,cin,数组,贪心,first From: https://www.cnblogs.com/yaowww/p/17355673.html