题意
参考了Discuss里面的。
如:
2 ABBAJJKZKZ
2代表有俩个座位,第一个A代表A来了,第一个B代表B来了,第二个B代表B走了,第二个A代表A也走了。字母代表顾客,当字母第一次出现的时候代表这个顾客来了,第二次出现代表该顾客走了,如果顾客是在没接收salon的时候就走了,公司的损失数就加一。
解决方法
用了两个string存储“正在享受服务的人员”和“不能享受服务的人员”。依次遍历输入串,根据不同的情况,进行相应的处理即可。详见代码。
代码
#include <iostream> using namespace std; string inServiceStr; //存储当前被服务的人员 string outServiceStr; //存储当前不能被服务的人员 int main() { int n; string s; while(cin >> n, n != 0) { cin >> s; inServiceStr.clear(); outServiceStr.clear(); int ans = 0; for(string::size_type i = 0; i != s.size(); i++) { char c = s[i]; string::size_type pos = inServiceStr.find(c); if(pos != string::npos) { /*若在inServiceStr找到c,则将其去掉。注意erase()的用法:若不带第二个参数,则默认去除pos下面所有字符。*/ inServiceStr.erase(pos, 1); continue; } pos = outServiceStr.find(c); if(pos != string::npos) { outServiceStr.erase(pos, 1); continue; } /*若在前面两个串均不能找到c*/ if(inServiceStr.size() < (unsigned)n) { inServiceStr.append(1, c); } else { outServiceStr.append(1, c); ans++; } } if(ans == 0) { cout << "All customers tanned successfully." << endl; } else { cout << ans << " customer(s) walked away." << endl; } } return 0; }