题目链接---------------------------------------------
翻译:有n个人去看电影,电影一共有m种,n个人会不同的语言,电影的字母和声音是不同的语言,人听到会说的语言或者看到能看懂的语言字母都会很高兴,选择一部电影,让高兴的人最多。
第一种解法:
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200010;
int a[MAXN],b[MAXN],c[MAXN];
map<int,int> cnt;
int n,m;
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
cnt[a[i]]++;
}
scanf("%d",&m);
for(int i = 1; i <= m; i++)
scanf("%d",&b[i]);
for(int i = 1; i <= m; i++)
scanf("%d",&c[i]);
int ans = 1, maxx1 = cnt[b[1]], maxx2 = cnt[c[1]];
for(int i = 2; i <= m; i++){
int x = cnt[b[i]];
int y = cnt[c[i]];
if(x >= maxx1){
if(x > maxx1){ ans = i; maxx1 = x; maxx2 = y; continue; }
else {
if(y > maxx2){ ans = i; maxx1 = x; maxx2 = y; continue; }
}
}
}
printf("%d\n",ans);
return 0;
}
第二种解法:
n个人与m种电影共涉及2*m+n门语言,把所有语言放进同一个数组,排序并离散化,统计会每种语言的人。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200010;
int a[MAXN],b[MAXN],c[MAXN],d[MAXN * 3],ans[MAXN * 3];
int cnt[MAXN];
int n,m,counts;
void discrete(){
counts = 0;
sort(d + 1, d + 2 * m + n + 1);
for(int i = 1; i <= 2 * m + n; i++){
if(i == 1 || d[i] != d[i - 1])
ans[++counts] = d[i];
}
}
int Query(int x){ return lower_bound(ans + 1,ans + counts + 1, x) - ans; }
int main(){
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
d[i] = a[i];
}
scanf("%d",&m);
for(int i = 1; i <= m; i++){
scanf("%d",&b[i]);
d[n + i] = b[i];
}
for(int i = 1; i <= m; i++){
scanf("%d",&c[i]);
d[m + n + i] = c[i];
}
//for(int i = 1; i <= 2 *m + n ;i++)
//cout << d[i] << endl;
discrete();
for(int i = 1 ; i <= n; i++){
cnt[Query(a[i])]++;
//cout << Query(a[i]) << endl;
}
int ans = 1,maxx1 = cnt[Query(b[1])],maxx2 = cnt[Query(c[1])];
for(int i = 2; i <= m; i++){
int x = cnt[Query(b[i])];
int y = cnt[Query(c[i])];
if(x >= maxx1){
if(x > maxx1) { ans = i ; maxx1 = x; maxx2 = y;continue; }
else {
if(y > maxx2){ ans = i; maxx1 = x; maxx2 = y; continue; }
}
}
}
printf("%d\n",ans);
return 0;
}