计蒜客题解——T1873:开花

这是一个很水的题目。标准二分查找模板题。

题目相关

题目链接

计蒜客,https://nanti.jisuanke.com/t/T1873

题目描述

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

输入格式

第一行两个整数 n,m (1 ≤ n, m ≤ 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 中。

AC 参考代码

#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;
    scanf("%d%d", &n, &m);
    //读入文学优秀奖
    for (i=0; i<n; i++) {
        scanf("%d", &a[i]);
    }
    //读入体育优秀奖
    for (i=0; i<m; i++) {
        scanf("%d", &b[i]);
    }

    //排序
    sort(b, b+m);

    for (i=0; i<n; i++) {
        if (binary_search(b, b+m, a[i])) {
            printf("%d ", a[i]);
        }
    }
    printf("\n");

    return 0;
}

时间复杂度

f(n)=n+m+logn,也就是 O(n)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

努力的老周

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

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

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

打赏作者

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

抵扣说明:

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

余额充值