题目大意:一个n个数的数组,对于数组中的两个数al,ar(l<r),如果两数相加为奇数,可以令ar=al,如果两数相加为偶数,可以令al=ar,要求在不超过n次的操作内,将整个数组变成非递增数组,输出一种可能情况
思路:因为要在n次内完成,最简单的方法就是令所有数都变成同一个数,首先把首尾两个数变成同一个数,然后对于中间的每一个数,如果和首尾的数奇偶相同,就让他变成尾数,奇偶不同则变成首数,操作次数正好为n-1次
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1e5 + 5;
int a[N], pos[N];
int main()
{
int t;
cin >> t;
while (t--)
{
memset(pos, 0, sizeof pos);
int n;
scanf_s("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf_s("%d", &a[i]);
}
printf("%d\n", n - 1);
if (n == 1)//注意特判n=1的情况
continue;
if ((a[1] + a[n]) & 1)
{
a[n] = a[1];
}
printf("1 %d\n", n);
int temp = a[1] & 1;//求首尾数的奇偶性
for (int i = 2; i <= n - 1; i++)
{
if ((a[i] & 1) == temp)//如果ai和首位数奇偶性相同,相加得到的是偶数
{
printf("%d %d\n", i, n);
}
else//反之相加的到的是奇数
{
printf("1 %d\n", i);
}
}
}
return 0;
}