您的位置:首页 > 其它

POJ-1250-Tanning Salon

2011-03-14 22:40 260 查看
题意

参考了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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: