提交时间:2025-03-14 15:06:36
运行 ID: 7160
#include <iostream> using namespace std; const int MAX_N = 100001; // 定义最大可能的棋盘长度 int main() { int n, m; int s[MAX_N]; // 存储棋盘序列 int ones[MAX_N]; // 存储白棋位置索引 // 读取输入 cin >> n >> m; for (int i = 0; i < n; ++i) { cin >> s[i]; } // 处理特殊情况:要求保留0个白棋 if (m == 0) { int max_zero = 0; // 最长连续黑棋长度 int sum = 0; // 当前连续黑棋计数 for (int i = 0; i < n; ++i) { if (s[i] == 0) { sum++; max_zero = max(max_zero, sum); } else { sum = 0; } } if (max_zero == 0) { cout << -1 << endl; // 没有黑棋存在 } else { cout << n - max_zero << endl; // 总长度减去最长黑棋段 } return 0; } // 收集所有白棋位置 int count = 0; // 白棋总数 for (int i = 0; i < n; ++i) { if (s[i] == 1) { ones[count++] = i; } } // 白棋数量不足的情况 if (count < m) { cout << -1 << endl; return 0; } // 滑动窗口寻找最优解 int min_remove = MAX_N; for (int i = 0; i <= count - m; ++i) { int left = ones[i]; // 窗口左边界 int right = ones[i + m - 1]; // 窗口右边界 int removal = left + (n - 1 - right); // 总删除次数 if (removal < min_remove) { min_remove = removal; } } cout << min_remove << endl; return 0; }