假设你在玩下面这个简单的电脑游戏。屏幕显示了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;
}

京公网安备 11010502036488号