日常一道算法题。
翻译
偶数数组
给你一个数组 a[0 ...... n -1],长度为 n,注意数组索引从 0 开始。
一个数组如果满足每个数组位置的值对 2 取余和位置对 2 取余的值相等,那么这个数组就被称为好数组。
对这个数组,你可以随意次数交换两个位置的值,你需要找到最小的交换次数。如果没有答案,则输出 -1。
输入格式
第一行输入整数 t,表示测试用例组数。
每行测试用例,第一行输入一个整数 n,表示数组的长度。
接下来输入一行整数,表示数组 a。
输出格式
输出最小移动次数,如果没有答案,输出 -1。
分析
首先判断奇数个数和偶数个数,需要平衡或者偶数比奇数多 1。
然后判断偶数位置的奇数个数,如果平衡就输出这个数量,否则输出 -1。
代码(Python3)
# https://codeforces.com/problemset/problem/1367/B
import sys
import os
import heapq
import math
try:
path = "./file/input.txt"
if os.path.exists(path):
sys.stdin = open(path, 'r')
# sys.stdout = open(r"./file/output.txt", 'w')
except:
pass
t = int(input())
def printd(value):
# print(value)
pass
def case():
n = int(input())
arr = list(map(int, input().split(" ")))
num = 0
result = 0
for index, value in enumerate(arr):
num += (1 if value % 2 == 0 else -1)
if index % 2 == 0 and value % 2 != 0:
result += 1
print(result if num == 0 or num == 1 else -1)
for _ in range(t):
case()
更多代码尽在 https://github.com/Tconan99/Codeforces
by 费城的二鹏 2020.06.29 长春