题意:给出26个门口,标号为A到Z,你有n个客人,每个客人都会去某个门进入城堡,每个门在需要进这个门的第一个人开始开着,到最后一个要进这个门的人才会关闭。如果某一时刻开着的门的数量超过k,那么就会有坏人溜进去城堡。问是否有这样不安全的时刻,有输出yes,否则输出no。
解法:只需要枚举一下26个字母的开始和结束的位置,存起来。然后再次枚举每一个时间点,看看是否会有超过k个门开着。
算算复杂度为O(n*k)。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
vector <pii> v;
int n, k, s, e;
char str[1000005];
int main() {
cin >> n >> k;
scanf("%s", str);
for(int i = 'A'; i <= 'Z'; i++) {
s = -1;
for(int j = 0; j < n; j++) {
if(str[j] == i) {
s = j;
break;
}
}
if(s != -1) {
for(int j = n - 1; j >= s; j--) {
if(str[j] == i) {
e = j;
break;
}
}
}
if(s != -1)
v.push_back(pii(s, e));
}
sort(v.begin(), v.end());
bool flag = 0;
int cnt;
for(int i = 0; i < n; i++) {
cnt = 0;
for(int j = 0; j < v.size(); j++) {
if(i >= v[j].first && i <= v[j].second)
cnt++;
}
if(cnt > k)
flag = 1;
}
if(flag) {
cout << "YES\n";
} else {
cout << "NO\n";
}
return 0;
}