Noder咖啡馆里面有N个座位,每天会有若干个顾客来店里面消费,会得到相应的服务。一个顾客占一个位置,顾客离开之后位置就会空出来。如果顾客来了之后没有位置,那么顾客就会直接离开,也就得不到服务。
现在已知座位数N,以及一天之内顾客来走的顺序,请统计一下有多少顾客没有得到服务。
收起
输入
单组测试数据。 第一行有一个整数N(1<=N<= 20 )。 第二行有若干个大写字母,表示顾客的来和走。字母是成对出现的,字母的第一次出现表示顾客来到了咖啡馆,字母的第二次出现表示该顾客离开了咖啡馆。每一种字母最多出现一对。没有座位的顾客总是在那些正在接受服务的顾客离开之前离开。
输出
输出一个整数,表示有多少顾客没有接受服务。
输入样例
样例输入1 2 ABBAJJKZKZ 样例输入2 3 GACCBDDBAGEE
输出样例
样例输出1 0 样例输出2 1
今天下午没事做,做了这道题,没想到花了我一下午时间,太水了- -,直接代码,思路就是有几个顾客在喝咖啡,如果达到要求的值则使未收到服务的人加一,代码如下:
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
string g;
int l[100000],z[100000];
int main() {
int a,b,c=0,d,e,f=1,n=0,h=0,x;
cin>>a;
cin>>g;
for(b=1;b<g.size();++b)
{c=0;
for(d=b-1;d>=0;--d)
{
if(g[b]!=g[d]&&f<a) c++;
else if(g[b]==g[d]&&f<a) {f--;c=0;break;}
else if(g[b]==g[d]&&f==a) {c=1000;break;}
else if(g[b]!=g[d]&&f==a) c++;
}
if(c==b&&f<a) f++;
else if(c==b&&f==a) {n++;z[h]=b;h++;}
else if(c==1000) ///难点就在这,当f==a,它有好几种可能,比如3个座位,abcda与abcdee有不同的结果,因为e是没有受到服务,不能让f-1,所以有了下面的代码。
{x=0;
for(d=0;d<=h-1;++d)
if(g[z[d]]!=g[b]) x++;
else {x=0;break;}
if(x==h) f--;
}
}
cout<<n;
return 0;
}