题目大意,输入一堆大写字母,每个字符从第一次出现到最后一次出现的这段时间内需要一个守卫, 问你在给定k给守卫的条件下,总需求会不会超过k个守卫。
这是一道思维题, 只需要记录每个字母出现的第一次的位置,和最后一次的位置,求一次区间最大覆盖就行了,由于数据量很小, 可以直接暴力。 代码如下:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
#define Max_N (1000000+100)
int n;
int k;
char door[Max_N];
int flag1[27];
int b[27];
int e[27];
int used[Max_N];
int main()
{
memset(flag1, 0, sizeof(flag1));
memset(b, -1, sizeof(b));
memset(e, -1, sizeof(e));
memset(used, 0, sizeof(used));
scanf("%d%d", &n, &k);
cin >> door;
int len = strlen(door);
for (int i = 0; i < len; i++) {
int num = door[i] - 'A';
if(!flag1[num]) {
b[num] = i;
e[num] = i;
flag1[num] = 1;
}
else e[num] = i;
}
for (int i = 0; i < 26; i++) {
if(b[i] == -1) continue;
for (int j = b[i]; j <= e[i]; j++)
used[j]++;
}
int sum = 0;
for (int i = 0; i < len; i++)
sum = max(used[i], sum);
//cout << sum << endl;
if (sum > k) cout << "YES" << endl;
else cout << "NO" << endl;
return 0;
}