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

A25199. 编程实现:有 n 颗棋子排成一排,每颗棋子的颜色为白色(用 1 表示)或黑色(用 0 表示)。每次可以选择从最左端或者最右端移除一颗棋子,目标是使剩余的棋子中白色棋子数量为 m。给定两个整数 n 和 m,及 n 颗棋子的颜色排列。请计算最少要移除多少颗棋子,才能使剩余的棋子中白色棋子数量为 m;如果无法实现该目标,输出 -1。例 1:n = 8,m = 2;8 颗棋子的颜色分别是 0 1 0 1…

填空题 容易

题目描述

编程实现:

有 n 颗棋子排成一排,每颗棋子的颜色为白色(用 1 表示)或黑色(用 0 表示)。每次可以选择从最左端或者最右端移除一颗棋子,目标是使剩余的棋子中白色棋子数量为 m。

给定两个整数 n 和 m,及 n 颗棋子的颜色排列。请计算最少要移除多少颗棋子,才能使剩余的棋子中白色棋子数量为 m;如果无法实现该目标,输出 -1。

例 1:n = 8,m = 2;8 颗棋子的颜色分别是 0 1 0 1 1 0 0 1,要使剩余的棋子中白色棋子数量为 2,最少需要移除 3 颗棋子,移除方案如下:

第一次,移除最右端的白色棋子,移除后剩余棋子的颜色分别是 0 1 0 1 1 0 0;

第二次,移除最左端的黑色棋子,移除后剩余棋子的颜色分别是 1 0 1 1 0 0;

第三次,移除最左端的白色棋子,移除后剩余棋子的颜色分别是 0 1 1 0 0;

此时,剩余棋子中白色棋子数量为 2。

例 2:n = 5,m = 3;5 颗棋子的颜色分别是 1 0 0 1 0,无论如何移除棋子都不能使剩余棋子中白色棋子数量为 3,则输出 -1。

输入描述:

第一行输入两个整数 n,m(1≤n,m≤1000),分别表示初始棋子数量和目标白色棋子数量,整数之间以一个空格隔开;

第二行输入 n 个整数(整数为 1 或 0,1 表示白色棋子,0 表示黑色棋子),表示从左到右每颗棋子的颜色,整数之间以一个空格隔开。

输出描述:

输出一个整数,表示最少要移除多少颗棋子,才能使剩余棋子中白色棋子的数量为 m;如果无论如何移除棋子都不能使剩余棋子中白色棋子数量为 m,则输出 -1。

样例输入:

8 2
0 1 0 1 1 0 0 1

样例输出:

3

参考答案

n, m = map(int, input( ).split( )) colors = list(map(int, input( ).split( ))) total_white = sum(colors) if total_white < m: print(-1) else: left = 0 right = n - 1 removed = 0 while left <= right and total_white > m: if colors[left] == 1: total_white -= 1 left += 1 removed += 1 elif colors[right] == 1: total_white -= 1 right -= 1 removed += 1 else: left += 1 removed += 1

答案解析

检查可行性: 若总白棋数 < m,直接输出 -1。

双指针贪心:

优先移除非目标白棋(0)。

若必须移除白棋(1),选择较少影响的一端。

终止条件: 剩余白棋数等于 m 或无法达成目标。

上一题 下一题