题目描述:
样例:
样例解析:
题意:给定一个数组a,可以在其中索引三个值x,y,z,并将ax替换为ay−az ,使最终生成非递减数组,如果没有解决方案就打印-1,否则打印操作次数m,已经对应的x,y,z。
思路:先判断数组是否已经满足条件,如还未满足,就试图将前n-2项都变为最后两项的差,此时就得判断最后两项的差与最后两项之间是否满足非递减的条件。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200005;
ll a[N];
ll t,n;
int main(){
ios::sync_with_stdio(false);
while(cin>>t){
while (t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
//判断数组是否已经是非递减
int f=0;
for(int i=1;i<=n-1;i++){
if(a[i]>a[i+1]){
f=1;
}
}
if(f==0){
cout<<"0"<<endl;
}else{
//如果数组最后两位成非递减趋势并且数组最后两位的差小于等于数组的倒数第二位,就能将前面的全部变成数组最后两位的差
if(a[n-1]-a[n]<=a[n-1]&&a[n-1]<=a[n]){
cout<<(n-2)<<endl;
for(int i=1;i<=n-2;i++){
cout<<i<<" "<<(n-1)<<" "<<n<<endl;
}
}else{
cout<<"-1"<<endl;
}
}
}
}
return 0;
}