给你一个长度为n的数组a[0…n1],它由非负整数组成。注意数组索引从零开始。
如果每个索引的奇偶性与该索引处元素的奇偶性匹配,则数组称为好数组。更正式地说,如果对于所有I(0≤I≤n-1),等式imod2=a[i]mod2成立,其中xmod2是x除以2的余数,则数组是好的。
比如数组[0,5,2,1]和[0,17,0,3]是好的,数组[2,4,6,7]是坏的,因为对于i=1,I和a[i]的parity是不同的:imod2=1mod2=1,但是a[i]mod2=4mod2=0。
在一次移动中,您可以获取数组的任意两个元素并交换它们(这些元素不一定相邻)。
找出你能使数组变好的最小移动次数,或者说这是不可能的。
输入
第一行包含单个整数t(1≤t≤1000)——测试中的测试用例数。然后测试用例随之而来。
每个测试用例以一行包含整数n(1≤n≤40)——数组a的长度——开始。
下一行包含n个整数a0,a1,…,an 1(0≤ai≤1000)-初始数组
输出
对于每个测试用例,输出一个整数——使给定数组成为好数组的最小移动次数,如果不可能,则输出-1
样例输入
4
4
3 2 7 6
3
3 2 6
1
7
7
4 9 2 1 18 3 0
样例输出
2
1
-1
0
提示
在第一个测试用例中,在第一次移动中,您可以交换索引为0和1的元素,在第二次移动中,您可以交换索引为2和3的元素。
在第二个测试案例中,在第一步中,您需要交换索引为0和1的元素。
在第三个测试案例中,您不能使数组变好。
这个题的意思是一个数组的下标的奇偶性要与所对应的数的奇偶性一致,比如a[0]为偶数 则a[0]对应的也要是偶数,如果不是偶数的话则需要和下标为奇数所对应的数字交换 下标为奇数的也是如此。
我当时做这个题的时候 也是非常懊恼呢… 写了一大串if语句 很是麻烦 。
可是听了学长的题解之后 发现可以换个思路做题。。
观察题可知 排除特殊的情况后 发现 不管这数怎么换 最终的结果必然是偶数下标对应偶数 奇数下标对应奇数 所以《不管下标是奇还是偶他们交换次数是一样的》 所以只需要输入这个交换次数 如果交换之后仍有不一样的则输出-1 下面上代码…
#include <bits/stdc++.h>//万能头文件
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int m;
cin>>m;
int a[m];
int c=0,b=0,i;
for(int i=0;i<m;i++)
cin>>a[i];
if(m==1) //m为1是是特殊情况 特殊考虑
{
if(a[0]%2!=0)
cout<<"-1"<<endl;
else
cout<<"0"<<endl;
continue;
}
if(m>1)
{
for(int i=0;i<m;i++)
{
if((i%2==0&&a[i]%2!=0)) //判断下标为偶数 但所对应的数是奇数的个数
c++;
if((i%2!=0&&a[i]%2==0))//判断下标为奇数 但所对应的数是偶数的个数
b++;
}
}
if(c==b) //如果c=b 则说明他们的下标所对应的数正好可以换到对应的下标的奇偶性 则就可以输出
cout<<c<<endl;
else //否则就说明c和b其中一个大 则他们必然换不到一起 输出-1
cout<<"-1"<<endl;
}
return 0;
}