【题解】AcWing 103.电影

AcWing 103.电影

题目描述

莫斯科正在举办一个大型国际会议,有 n n n 个来自不同国家的科学家参会。

每个科学家都只懂得一种语言。

为了方便起见,我们把世界上的所有语言用 1 1 1 1 0 9 10^9 109 之间的整数编号。

在会议结束后,所有的科学家决定一起去看场电影放松一下。

他们去的电影院里一共有 m m m 部电影正在上映,每部电影的语音和字幕都采用不同的语言。

对于观影的科学家来说,如果能听懂电影的语音,他就会很开心;如果能看懂字幕,他就会比较开心;如果全都不懂,他就会不开心。

现在科学家们决定大家看同一场电影。

请你帮忙选择一部电影,可以让观影很开心的人最多。

如果有多部电影满足条件,则在这些电影中挑选观影比较开心的人最多的那一部。

输入格式

第一行输入一个整数 n n n,代表科学家的数量。

扫描二维码关注公众号,回复: 13393812 查看本文章

第二行输入 n n n 个整数 a 1 , a 2 … a n a_1,a_2…a_n a1,a2an,其中 a i a_i ai 表示第 i i i 个科学家懂得的语言的编号。

第三行输入一个整数 m m m,代表电影的数量。

第四行输入 m m m 个整数 b 1 , b 2 … b m b_1,b_2…b_m b1,b2bm,其中 b i b_i bi 表示第 i i i 部电影的语音采用的语言的编号。

第五行输入 m m m 个整数 c 1 , c 2 … c m c_1,c_2…c_m c1,c2cm,其中 c i c_i ci 表示第 i i i 部电影的字幕采用的语言的编号。

请注意对于同一部电影来说, b i ≠ c i b_i≠c_i bi=ci

同一行内数字用空格隔开。

输出格式

输出一个整数,代表最终选择的电影的编号。电影编号 1 ∼ m 1∼m 1m

如果答案不唯一,输出任意一个均可。

数据范围

1 ≤ n , m ≤ 200000 1≤n,m≤200000 1n,m200000
1 ≤ a i , b i , c i ≤ 1 0 9 1≤a_i,b_i,c_i≤10^9 1ai,bi,ci109

输入样例

3
2 3 2
2
3 2
2 3

输出样例

2

题目分析

虽然语言数目高达 1 0 9 10^9 109,但科学家与电影的总数在 2 × 1 0 5 2×10^5 2×105 以内,涉及的语言数目最多为 6 × 1 0 5 6×10^5 6×105,所以采用离散化。离散化后只需对每部电影统计很开心的人数和比较开心的人数,求最大值所对应的电影即可。注意有可能很开心的人数和比较开心的人数均为 0 0 0,特判一下输出 [ 1 , m ] [1,m] [1,m] 中任意整数即可

代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int N = 200010;
vector < int > a;
int s[N], movie[N][2], sum[3 * N];
int n, m, maxa, maxb, res;

int find(int x){
    
    
    return lower_bound(a.begin(), a.end(), x) - a.begin() + 1;
}

int main(){
    
    
    ios::sync_with_stdio(0);
    cin >> n;
    for (int i = 1; i <= n; i ++)
        cin >> s[i], a.push_back(s[i]);
    cin >> m;
    for (int i = 1; i <= m; i ++)
        cin >> movie[i][0], a.push_back(movie[i][0]);
    for (int i = 1; i <= m; i ++)
        cin >> movie[i][1], a.push_back(movie[i][1]);
        
    sort(a.begin(), a.end());
    a.erase(unique(a.begin(), a.end()), a.end());

    for (int i = 1; i <= n; i ++)
        sum[find(s[i])] ++;

    for (int i = 1; i <= m; i ++){
    
    
        int a = sum[find(movie[i][0])], b = sum[find(movie[i][1])];
        if (a > maxa || a == maxa && b > maxb)
            maxa = a, maxb = b, res = i;
    }
    if (res == 0) res = 1;  //记得特判
    cout << res;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/f4u4u4r/article/details/121570567