蓝桥杯练习【STL训练】——周瑜的反间计

题目描述:

曹操率兵东指。东吴都督周瑜在接到曹操的挑战信后,即毁书斩使,以表白抵抗的决心。于是引发了曹操与东吴在三江口的一番交战。周瑜打了胜仗,但他仍能谨慎从事,进行调查研究,连夜暗窥曹营。周瑜发现曹操水军的指挥官是从刘表手下归降曹操的蔡瑁、张允,就产生了“必设计先除此二人”的打算。此时曹营中的幕僚蒋干出来自荐,说愿意去东吴说服周瑜前来归降,而且表示保证能完成任务。接着,周瑜听说老同学蒋干来访,就决定利用施行反间之计。周瑜先在大会群英的宴席上,定下了“但叙朋友交情”,不提“军旅之事”的规矩,封住蒋干的口,断绝蒋干说降的念头。在夜间,周瑜与蒋干“抵足而眠”,佯装酒醉酣睡,诱使蒋干偷走一封伪造蔡瑁、张允投降东吴的书信。蒋干原为没有完成说降周瑜的使命发愁,幸亏得了这份重要“情报”,就连夜溜回曹营去报功。曹操看了这封信大怒,喝令杀了蔡、张二将。周瑜的反间计终于获得成功。却说这蒋干除了周瑜伪造的信件之外,还偷偷的从周瑜处拿到了许多文件。这些文件有真有假,每个文件都有一独立的编号。现在他想跟已有的文件编号做对比,如果该文件编号存在于已有编号,那么就可判断此文件为真实的。你可以写一个程序帮助蒋干么?

输入:

本题包含多组case。每组case第一行是一个整数N(1<=N<=1000),当N为-1时输入结束且不需要输出。接下来输入N个不同的数字,代表已有文件的编号,编号i的范围是(0<=i<=2^31-1)。然后是一个整数M(1<=M<=100000),接下来的M个数字代表M个询问,询问当前输入编号所代表的文件是否为真实的。

输出:

对于每一个询问,如果该编号所代表的文件是真是的,输出“YES”,否则
输出“NO”。每组case后有一个空行。

样例输入:

3 
4 10 6 
2 
1 
4 
-1 

样例输出:

NO 
YES

解题思路:

本题主要考察的是查询,直接使用STL库中的binary_search可以大大减少代码量。但是要注意的是binary_search仅在有序序列中查找,在无需序列中不可使用,故在本题中先使用了sort函数对序列进行排序,再使用binary_search函数查询。

在做题过程中我先用了if循环来限制N==0的情况,但出现了输出超限的情况,且部分答案错误。经过分析,答案错误是由于没有进行排序,直接使用了binary_search函数而导致的,使用sort函数排序后解决了答案错误的情况,然后把if循环改成了while循环,解决了输出超限的情况。

参考代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int N,M;
    bool flag;
    int arr1[1001],arr2[1001];//arr1表示已有编号,arr2表示要询问的编号
    while(1){
        cin>>N;
        if(N== -1)
        break;
        else{
            for(int i=0;i<N;i++){
                cin>>arr1[i];
            }
            cin>>M;
             for(int i=0;i<M;i++){
                cin>>arr2[i];
            }
            sort(arr1+ 0,arr1+N);
            for(int i=0;i<M;i++){
                flag=binary_search(arr1+ 0,arr1+N,arr2[i]);
                if(flag){
                    cout<<"YES"<<endl;
                }
                else{
                    cout<<"NO"<<endl;
                }
            }
            cout<<endl;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值