电影Cinema

AcWing

题意:莫斯科正在举办一个大型国际会议,有n个来自不同国家的科学家参会。每个科学家都只懂得一种语言。为了方便起见,我们把世界上的所有语言用\(1\)\(10^9\)之间的整数编号。在会议结束后,所有的科学家决定一起去看场电影放松一下。他们去的电影院里一共有m部电影正在上映,每部电影的语音和字幕都采用不同的语言。对于观影的科学家来说,如果能听懂电影的语音,他就会很开心;如果能看懂字幕,他就会比较开心;如果全都不懂,他就会不开心。现在科学家们决定大家看同一场电影。请你帮忙选择一部电影,可以让观影很开心的人最多。如果有多部电影满足条件,则在这些电影中挑选观影比较开心的人最多的那一部。

分析:把所有涉及到的\(2*m+n\)种语言放入一个数组然后排序并离散化,然后就可以直接统计每种电影的语音语言和字幕语言的人数.

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
inline int read(){
    int x=0,o=1;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')o=-1,ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*o;
}
const int N=200005;
int n,m,k,maxn,Ans,real_ans;
int a[N],b[N],c[N],d[N*3],e[N*3],tong[N*3],ans[N*3];
inline int query(int x){return lower_bound(e+1,e+k+1,x)-e;}
int main(){
	n=read();
	for(int i=1;i<=n;++i)a[i]=read(),d[i]=a[i];
	m=read();
	for(int i=1;i<=m;++i)b[i]=read(),d[n+i]=b[i];
	for(int i=1;i<=m;++i)c[i]=read(),d[n+m+i]=c[i];
	int sum=2*m+n;sort(d+1,d+sum+1);
	for(int i=1;i<=sum;i++)if(i==1||d[i]!=d[i-1])e[++k]=d[i];
	for(int i=1;i<=n;++i)tong[query(a[i])]++;
	for(int i=1;i<=m;++i)maxn=max(maxn,tong[query(b[i])]);
	for(int i=1;i<=m;++i)if(tong[query(b[i])]==maxn)ans[++Ans]=i;
	if(Ans==1){printf("%d\n",ans[Ans]);return 0;}
	else{
		maxn=0;
		for(int i=1;i<=Ans;++i){
			int cnt=tong[query(c[ans[i]])];
			if(cnt>maxn)maxn=cnt,real_ans=ans[i];
		}
		if(real_ans==0)real_ans=ans[1];
	}
	printf("%d\n",real_ans);
    return 0;
}

posted on 2019-07-22 21:59  PPXppx  阅读(265)  评论(0编辑  收藏  举报