【PAT】1121 Damn Single (25 分)

46 篇文章 0 订阅
44 篇文章 0 订阅
  • 题目大意:找到party中的单身狗,并将这些单身狗升序输出

  • 思路1:用map存每队情侣,因为要升序输出单身狗,用vector存参加派对的人,排除情侣,剩下的单身狗们存set里,最后直接输出set就可。

    不行,超时了。

  • 思路2:用map存每队情侣,用set存参加派对的人,检查s[i]的情侣是否存在,若存在就将他们两个人都删掉,最后剩下的就是单身狗。

    注意:要考虑number = 00000的情况!若我将变量设置为int型,number = 00000 时,在查情侣时出现明明没有情侣,却把这个人删除的情况。把变量设置为string类型就不会出现这种问题了。

  • 知识点:

    1. map
    2. set
    3. 访问元素:用迭代器
    4. 输入string型数据要用cin
  • 代码:

    #include <iostream>
    #include <string>
    #include <map>
    #include <set>
    using namespace std;
    
    int main(){
        int n, m;
        string c1, c2, people;
        cin >> n;
        map<string, string> couples;
        set<string> singles;
    
        for(int i = 0; i < n; i++){
            cin >> c1 >> c2;
            couples[c1] = c2;
            couples[c2] = c1;
        }
    
        cin >> m;
        for(int i = 0; i < m; i++){
            cin >> people;
            singles.insert(people);
        }
    
        auto it = singles.begin();
        while(it != singles.end()){
            if(singles.find(couples[*it]) != singles.end()){ // 有一对情侣就将他们删除
                singles.erase(*(singles.find(couples[*it])));   // 先删除这个人的情侣,再删除这个人
                singles.erase(*it);
                it = singles.begin();   // 因为删除后set变了,该从头遍历set
            }
            else
                it++;
        }
    
        printf("%d\n", singles.size());
        for(auto i = singles.begin(); i != singles.end(); i++){
            if(i != singles.begin())
                printf(" ");
            printf("%s", (*i).c_str());
        }
    
        return 0;
    }
    
  • 总结:

    1. map

    2. set

      1. 访问元素:用迭代器

      2. 找特殊元素:

        #include <iostream>
        #include <set>
        using namespace std;
        
        int main(){
            set<int> s = {0, 3, 1, -2, 10};
            auto pos = s.find(-2);   // 先找这个元素的位置,返回一个迭代器
            cout << *pos;   // 取值,输出
            return 0;
        }
        
    3. 输入string型数据要用cin

    4. 删除情侣后,记得重新定义迭代器的位置,因为set已经变了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值