当前位置:首页 > 题解目录 > 正文内容

【题解】开花

亿万年的星光4年前 (2022-03-12)题解目录1710

【题目描述】

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

【输入描述】


第一行两个整数 n,m\ (1\le n,m \le 10^5) ,分别表示文学优秀奖和体育优秀奖的获奖人数。

第二行 n 个不同的整数,表示获得文学优秀奖的同学编号。

第二行 m 个不同的整数,表示获得体育优秀奖的同学编号。

所有编号为正整数且不超过 10^9 。

【输出描述】


一行若干个空格分隔的整数,表示开花的同学编号,按文学优秀奖的先后次序输出。

【样例输入】

4 4
5 1 7 3
2 3 4 1

【样例输出】

 1 3

【题目分析】

根据样例,我们知道获得文学优秀奖的同学有 5 1 7 3,获得体育优秀奖的同学有 2 3 4 1。那么同时获得文学优秀奖和体育优秀奖的同学是 1 和 3,题目要求按照文学优秀奖获奖顺序输出。故而输出的结果是 3 1。

由于数据最大可能是 10^5,故算法必须优于 O(nlogn)。同时我们需要在体育优秀奖里搜索获得文学优秀奖名单。所以可以考虑用二分查找,这样算法的复杂度为 O(logn)。

1、读入文学优秀奖同学,存入数组 a。

2、读入体育优秀奖同学,存入数组 b。

3、排序数组 b,因为要在体育优秀奖里搜索文学优秀奖名单。

4、遍历数组 a,查看 a[i] 是否在数组 b 中。


【参考代码1】

#include <bits/stdc++.h>
using namespace std;
 
const int MAXN = 1e5+6;
const int MAXM = 1e5+6;
int a[MAXN];//文学优秀奖
int b[MAXM];//体育优秀奖
 
int main() {
    //读入数据
    int n,m,i;
 	cin>>n>>m; 
    //读入文学优秀奖
    for (i=0; i<n; i++) {
        cin>>a[i];
    }
    //读入体育优秀奖
    for (i=0; i<m; i++) {
          cin>>b[i];
    }
    //排序
    sort(b, b+m);
    for (i=0; i<n; i++) {
        if (binary_search(b, b+m, a[i])) {
            cout<<a[i]<<" ";
        }
    }
    printf("\n");
 
    return 0;
}


【参考代码2】

#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;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

标签: 二分
分享给朋友:

相关文章

【题解】王国比赛

【题解】王国比赛

【题目描述】智慧之王 Kri 统治着一座王国。 这天 Kri 决定举行一场比赛,来检验自己大臣的智慧。 比赛由 n道判断题组成,有 m位大臣参加。现在你已经知道了所有大臣的答题情况,但尚未拿到答...

【题解】大整数减法

【题目描述】求两个大的正整数相减的差。【输入】共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。【输出】一行,即所求的差。【输入样例】9999...

【题解】最大公约数(2019青岛市程序设计竞赛)

【问题描述】给定n,以及正整数序列a1,a2,…,an与b1,b2,…,bn。令:sa=a1*a2*…*ansb=b1*b2*…*bn求sa和sb的最大公约数gcd(sa,sb)。【输入】第一行n。第...

【题解】最长不下降子序列2

【题目描述】设有由n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)且b(i)≠b(j)(i≠j),若存在i1<i2<i3<…<ie 且有b...

【题解】流感传染

【题目描述】有一批易感人群住在网格状的宿舍区内,宿舍区为n\*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已...

【题解】舞蹈机器人

题目描述在一个拥有无限大小的二维平面的原点处,有一个舞蹈机器人,这个机器人将在这个平面上跳舞。这个机器人每次可以向自己的前方移动一个单位的长度,由于它需要在移动的过程中跳舞,因此,舞蹈机器人每移动一次...