如何选择电影:
1.听懂人数最多的。
2.若有多部电影的听懂人数均最多,选看懂字幕人数最多的。
3.若仍有多种选择,输出任意一个。
所以我们可以用一个结构体来存电影信息:
电影语音、电影字幕、电影编号、能听懂的人数、能看懂的人数。
接着按照上面选择电影的规则写一个比较函数(见代码),对电影排序之后,第一部电影就是答案,输出该电影的编号即可。
如何算一部电影有多少人能听懂看懂,其实可以转变为某种语言有多少人懂。我们可以建立一个数组来存每种语言有多少人懂。但是本题的语言的范围是1e9,我们肯定不能创建大小为1e9的数组。但是人数和电影数量只有2e5,那最多只会出现6e5种不同的语言,所以我们对语言进行离散化即可。
离散化可以用vector+map,也可以选择其他方案。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
struct Film{
int x,y,id;
}f[N];
bool operator<(const Film&a,const Film&b){
if(a.x==b.x)return a.y>b.y;
return a.x>b.x;
}
vector<int>vec;
map<int,int>mp;
int n,m;
int a[N];
int s[N*3];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
vec.push_back(a[i]);
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d",&f[i].x);
f[i].id=i;
vec.push_back(f[i].x);
}
for(int i=1;i<=m;i++){
scanf("%d",&f[i].y);
vec.push_back(f[i].y);
}
sort(vec.begin(),vec.end());
int t=vec.erase(unique(vec.begin(),vec.end()),vec.end())-vec.begin();
for(int i=0;i<t;i++)mp[vec[i]]=i;
for(int i=1;i<=n;i++){
s[mp[a[i]]]++;
}
for(int i=1;i<=m;i++){
f[i].x=s[mp[f[i].x]];
f[i].y=s[mp[f[i].y]];
}
sort(f+1,f+1+m);
printf("%d",f[1].id);
return 0;
}