Vector练习(间谍)

题目描述:

        X国的情报委员收到一份可靠的信息,信 息表明Y国将派间谍去窃取X国的机密文件。X国指挥官手中有两份名单 列表,一份是Y国派往X国的间谍名单列表,另一份是X国以前派往Y国 的间谍名单列表。这两份名单列表可能有些重叠。因为间谍可能同时 扮演两个角色,称之为“双重间谍”。因此,Y国可以把双重间谍送回 X国。很明显,这对X国是有利的,因为双重间谍可以把Y国的机密文件 带回,而不必担心被Y国边境拘留。所以指挥官决定抓住由Y国派出的 间谍,让普通人和双重间谍进入。那么你能确定指挥官需要抓捕的间 谍名单吗?

分析:

有几个测试用例。每个测试用例都包含4部分。第1部分包 含3个正整数 A、B 、C , A是进入边境的人数, B是Y国将派出的间 谍人数, C是X国以前派到Y国的间谍人数。第2部分包含A 个字符串, 为进入边境的人员名单。第3部分包含B 个字符串,为由Y国派出的间 谍名单。第4部分包含 C个字符串,即双重间谍的名单。每个测试用例 后都有一个空白行。在一份名单列表中不会有任何名字重复,如果有 重复的名字出现在两份名单列表中,则表示同一个人。

(1)定义4个vector,分别记录3行字符串和答案。

(2)判断第2行在第1行中出现但没在第3行中出现的字符串,将 其添加到答案中。

(3)如果答案数组不空,则按顺序输出。

代码:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector<string> x,y,z,ans;
int main()
{
    int a,b,c;
    string s;
    while (cin >> a >> b >>c)
    {
        x.clear(),y.clear(),z.clear(),ans.clear();
        for(int i = 0;i < a;i++)
        {
            cin >> s;
            x.push_back(s);
        }
        for (int i = 0; i < b; i++)
        {
            cin >> s;
            y.push_back(s);
        }
        for (int i = 0; i < c; i++)
        {
            cin >> s;
            z.push_back(s);
        }
        for (int i = 0; i < b; i++)//判断第2行在第1行中出现但没在第3行中出现的字符串
        {
            //find(first,last,val)
            //其中first,last为输入迭代器,[first,last)用于指定该函数的查找范围,val为要查找的目标元素
            if (find(x.begin(),x.end(),y[i])!=x.end())
                if (find(z.begin(),z.end(),y[i])==z.end())
                    ans.push_back(y[i]);
            //find(x.begin(),x.end(),y[i])!=x.end()中!=x.end()这里的end()并不是表示最后一个元素,最后一个元素在end()-1里面
            // !=x.end()说明还没走到末尾就已经找到了这个元素,=z.end()说明走到了末尾还没有找到这个元素
            /*find函数的源代码如下
             *
             * template <class _InputIterator, class _Tp>
             * inline _LIBCPP_INLINE_VISIBILITY
             * _InputIterator
             * find(_InputIterator __first, _InputIterator __last, const _Tp& __value_)
             * {
             *      for (; __first != __last; ++__first)
             *          if (*__first == __value_)
             *              break;
             *      return __first;
             * }
             * */
        }
        if (!ans.size())
            cout << "No enemy spy\n";
        else{
            for (int i = 0; i < ans.size(); i++)
            {
                if (i!=0)
                    cout << " ";
                cout << ans[i];
            }
            cout << endl;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大不了_自己学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值