题意:一共有A到Z 26个门,给每个顾客的人数,以及每个人从哪个门进,同时给守卫的人数,每个守卫只有在这道门的最后一个顾客进去之后才能去别的门,问对给出的顾客情况,一共需要多少个守卫,如果需要的守卫人数多于实际的人数则输出YES,否则输出NO 。
题解:记录下来每个门第一个顾客到达的时间以及最后一个顾客到达的时间,暴力:当第一个顾客来的时候就加一,最后一个顾客来的时候就减一,中间每次判断一下。
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
const int N=1e6+7;
int n,k,cnt;
char s[N];
int l[30],r[30];
int f[30];
int main( )
{
cin>>n>>k;cin>>s+1;for(int i=1;i<=n;i++){
if(!l[s[i]-'A'])l[s[i]-'A']=i;r[s[i]-'A']=i;}for(int i=1;i<=n;i++)//下标一定从1开始,如果从0开始,那么如果有的门//没有顾客cnt就多加了。{
for(int j=0;j<26;j++){
if(l[j]==i) cnt++;if(cnt>k){
cout<<"YES";return 0;}if(r[j]==i) cnt--;}}if(cnt>k) cout<<"YES"<<endl;else cout<<"NO"<<endl;return 0;
}