测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A25680. 相同颜色的石头编程实现有两排石头,每排 n 颗,从左到右依次排开,每颗石头的颜色为黄色或者绿色。每次可以选择第一排的任意一颗石头与第二排的任意一颗石头交换位置。请计算最少需要交换多少次才能让每一列石头的颜色都相同;如果无论交换多少次都无法使每一列石头的颜色都相同,则输出 -1。例如:n = 3,每排 3 颗石头;第一排 3 颗石头颜色从左到右依次是黄、绿、绿:第二排 3 颗石头颜色从左到右依次是…

填空题 中等

题目描述

相同颜色的石头

编程实现

有两排石头,每排 n 颗,从左到右依次排开,每颗石头的颜色为黄色或者绿色。

每次可以选择第一排的任意一颗石头与第二排的任意一颗石头交换位置。请计算最少需要交换多少次才能让每一列石头的颜色都相同;如果无论交换多少次都无法使每一列石头的颜色都相同,则输出 -1。

例如:n = 3,每排 3 颗石头;

第一排 3 颗石头颜色从左到右依次是黄、绿、绿:

第二排 3 颗石头颜色从左到右依次是绿、绿、黄:

其中一种最少交换次数的方案如下:

(1)先将第一排的第 3 颗石头与第二排的第 3 颗石头交换位置;

(2)再将第一排的第 3 颗石头与第二排的第 1 颗石头交换位置。

此时每一列的石头颜色都相同,故至少需要交换 2 次。

输入描述

第一行输入一个整数 n(1≤n≤10^5),表示每排的石头数量;

第二行输入 n 个整数,整数只能为 1 或 0,1 表示黄色,0 表示绿色,表示第一排从左到右每颗石头的颜色,整数之间以一个空格隔开;

第三行输入 n 个整数,整数只能为 1 或 0,1 表示黄色,0 表示绿色,表示第二排从左到右每颗石头的颜色,整数之间以一个空格隔开。

输出描述

输出一个整数,表示最少的交换次数;如果无论交换多少次都无法使每一列的石头颜色都相同,则输出 -1。

样例输入

3
1 0 0
0 0 1

样例输出

2

参考答案

def min_swap(n, row1, row2): # 统计 (1, 0) 和 (0, 1) 的个数 y_g = 0 # 1,0: 第一排黄,第二排绿 g_y = 0 # 0,1: 第一排绿,第二排黄 for i in range(n): if row1[i] == 1 and row2[i] == 0: y_g += 1 elif row1[i] == 0 and row2[i] == 1: g_y += 1 # 如果两者的数量相等,可以通过交换消除不匹配 if y_g == g_y: return g_y + g_y else: return -1 n = int(input()) # 石头的数量 row1 = list(map(int, input().split())) # 第一排的石头颜色 row2 = list(map(int, input().split())) # 第二排的石头颜色 # 计算并输出结果 result = min_swap(n, row1, row2) print(result)
上一题 下一题