莫斯科正在举办一个大型国际会议,有 n 个来自不同国家的科学家参会。
每个科学家都只懂得一种语言。
为了方便起见,我们把世界上的所有语言用 1 到 10^9 之间的整数编号。
在会议结束后,所有的科学家决定一起去看场电影放松一下。
他们去的电影院里一共有 m 部电影正在上映,每部电影的语音和字幕都采用不同的语言。
对于观影的科学家来说,如果能听懂电影的语音,他就会很开心;如果能看懂字幕,他就会比较开心;如果全都不懂,他就会不开心。
现在科学家们决定大家看同一场电影。
请你帮忙选择一部电影,可以让观影很开心的人最多。
如果有多部电影满足条件,则在这些电影中挑选观影比较开心的人最多的那一部。
输入格式
第一行输入一个整数 n,代表科学家的数量。
第二行输入 n 个整数 a1,a2…an,其中 ai 表示第 i 个科学家懂得的语言的编号。
第三行输入一个整数 m,代表电影的数量。
第四行输入 m 个整数 b1,b2…bm,其中 bi 表示第 i 部电影的语音采用的语言的编号。
第五行输入 m 个整数 c1,c2…cm,其中 ci 表示第 i 部电影的字幕采用的语言的编号。
请注意对于同一部电影来说,bi≠ci。
同一行内数字用空格隔开。
输出格式
输出一个整数,代表最终选择的电影的编号。电影编号 1∼m。
如果答案不唯一,输出任意一个均可。
数据范围
1≤n,m≤200000,
1≤ai,bi,ci≤10^9
输入样例:
3
2 3 2
2
3 2
2 3
输出样例:
2
解题思路:
这道题需要统计科学家懂得语言的编号数目,因为语言编号范围在 1~10^9 范围太大不能用普通的数组,我们就要用 map 容器,map<int,int> 就相当于一个数组的升级版,这样就能统计各个编号的数目。为了在比较的过程中更方便一点,我这里用了一个简单的结构体来存每个电影的语音和字幕的语言编号,我们先通过比较,找到能被最多人听懂电影语音的电影,并记录该电影语音和字幕的语言编号以及电影的位置,接着在语音被相同数目的科学家听懂的电影中,找到字幕能被最多科学家看懂的电影,然后更新电影字幕和电影的位置,最后成功找到符合条件的一部电影输出(如果语言都不同就输出第一部电影)。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=2*1e5+5;
int a[N];
map<int,int>s; //10^9太大了,不能开数组,map相当于数组的升级版
struct dy { //结构体存每个电影的语音和字幕
int b,c;
} d[N];
int main() {
int n,m,yy=0,zm=0,t=1;
cin>>n;
for(int i=0; i<n; i++) {
cin>>a[i];
s[a[i]]++; //统计科学家懂某种语言的人数
}
cin>>m;
for(int i=1; i<=m; i++)
cin>>d[i].b;
for(int i=1; i<=m; i++)
cin>>d[i].c;
for(int i=1; i<=m; i++) {
if(s[d[i].b]>yy) { //寻找语音能被最多科学家听懂的电影
yy=s[d[i].b]; //yy表示电影语音能被听懂的最多人数
zm=s[d[i].c]; //zm表示在电影语音被最多人听懂时,电影字幕能被看懂的最多人数
t=i; //t记录第几部电影能使更多人开心
}
if(s[d[i].b]==yy&&s[d[i].c]>zm) {//在语音被相同数量的科学家听懂时,寻找字幕能被最多科学家看懂的电影
zm=s[d[i].c];
t=i;
}
}
cout<<t<<endl;
return 0;
}