每日打卡-5.1

发布时间 2023-04-16 20:44:14作者: leapss

一.问题描述

  小A所在的学校又迎来了一年一度的开花活动,有 n 名学生被评为文学优秀奖,m 名学生被评为体育优秀奖。现已知两个奖项获奖同学的编号,每个同学都有唯一的编号。只有同时被评为文学优秀奖和体育优秀奖的学生才能开花,小A想知道开花的名单,请你帮他统计一下。

注:1<=n,m<=1e5

二.设计思路

对每个文学优秀奖的获得者,在体育优秀奖中查找即可。也就是在一个数组中找一个数,也就转化为二分搜索问题。

三.流程图

 

四.伪代码 

1

五.代码实现 

1#include<bits/stdc++.h>
using namespace std;
int t[100005];
int w[100005];
int binary_search(int x, int l, int r){
    while(l <= r){
        int mid = (l + r) >> 1;
        if(t[mid] == x){
            return mid;
        }
        if(t[mid] < x){
            l = mid + 1;
        }else{
            r = mid - 1;
        }
    }
    return -1;
}
int main(){
    int n, m;
    cin >> n >> m;
    for(int i = 0; i < n; ++i){
        cin >> w[i];
    }
    for(int i = 0; i < m; ++i){
        cin >> t[i];
    }
    sort(t, t + m);
    int t = 0;
    for(int i = 0; i < n; ++i){
        if(binary_search(w[i], 0, m - 1) != -1){
            t++;
            if(t == 1) cout << w[i];
            else{
                cout << " " << w[i];
            }
            
        }
    }
    return 0;
}