假设你在玩下面这个简单的电脑游戏。屏幕显示了n个排列整齐的立方体。每个立方体被涂上m种颜色中的一种。您可以删除不超过k个数据集(这些数据集不必一个接一个地删除)。之后,其余的***数据集连接在一起(这样间隙就被关闭了),系统计算分数。你得到的点数等于连续出现的相同颜色方块的最大序列的长度。编写一个程序,确定您可以得分的最大可能的点数。
记住,删除的数据集不能超过k个。完全不允许删除***数据集。
输入
第一行包含三个整数n, m和k(1≤n≤2·105,1≤m≤105,0≤k < n)。第二行包含从1到m的n个整数——立方体颜色的个数。颜色的数量由单个空格分隔。
输出
打印您可以得分的最大可能点数。
题意:给你一个序列a, 序列中的颜色a[i]代表一种颜色,每种用1-m表示,然后你有最多k次删除其中的一些颜色,删除后相邻位置连接,问:你在不超过k个删除是,使得序列连续颜色最大
题解:双指针,首先我们以左边第一个颜色a[l]为最长序列,然后判断r指针在满足(r - l + 1) - (cnt[a[l])<= k 条件下向后移动最多能走多远,不能走就l向前移动,再以a[l]作为最长序列
#include <bits/stdc++.h> using namespace std; const int maxn = 1e6 + 5; int a[maxn], cnt[maxn]; int main() { int n, m, k; scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } int l = 1, r = 1; int ans = 0; cnt[a[1]]++; while (l <= n) { if (((r - l + 1) - cnt[a[l]]) <= k){ // cout << l << " " << r << endl; ans = max(ans, cnt[a[l]]); if (r < n) { r++; cnt[a[r]]++; } else { cnt[a[l]]--; l++; } } else { cnt[a[l]]--; l++; } } printf("%d\n", ans); return 0; }