题库首页 › 蓝桥杯大赛(C语言) › 题目 14719

移除棋子 题目描述: 有 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。 输入描述: 第一行输入两个整数 n,m(1≤n,m≤106),分别表示初始棋子数量和目标白色棋子数量,整数之间以一个空格隔开; 第二行输入 n 个整数(整数为 1 或 0,1 表示白色棋子,0 表示黑色棋子),表示从左到右每颗棋子的颜色,整数之间以一个空格隔开。 输出描述: 输出一个整数,表示最少要移除多少颗棋子,才能使剩余棋子中白色棋子的数量为 m;如果无论如何移除棋子,都不能使剩余棋子中白色棋子的数量为 m,则输出 -1。 样例输入: 8 2 0 1 0 1 1 0 0 1 样例输出: 3

正确答案:参考程序(Python):n,m=map(int,input().split());a=list(map(int,input().split()));total=a.count(1);if total<m:print(-1);else:#保留含m个1的最长连续子段(滑动窗口),移除=n-该长度。res=0;l=0;cnt1=0;for r in range(n):cnt1+=a[r];while cnt1>m:cnt1-=a[l];l+=1;if cnt1==m:res=max(res,r-l+1);pr

试卷来源:202503(第16届)蓝桥杯C++编程青少组(选拔赛_中高级)真题

本卷相关题目

在线做题 同科目题库