Codeforces 1367B - Even Array

日常一道算法题。

翻译

偶数数组

给你一个数组 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 长春

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。