离散化的方式写,过程写在程序里的
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 200010;
int n, m;
int a[N], b[N], c[N];
int lang[N * 3], mini[N * 3];//定义一个长数组,和一个短数组用来存储
int tt, ee;//用来计数的
int ans[N * 3];//记录那场电影有多少人懂
//这里find函数与
/*for (int i = 1; i <= tt; i ++ )
{
if (ee == 0 || lang[i] != lang[i - 1])//避免重复
mini[++ ee] = lang[i];
}*/
//这行连用,大体整过来呢就是,返回的r的值就是,这里稍等,往下看
//配合这一回代码理解
/*
for (int i = 1; i <= n; i ++ )
ans[find(a[i])] ++;
*/
//a[i] 到find函数后也被返回了mini数组里的下标,整体还是那个值
int find(int x)
{
int l = 0, r = ee + 1;
while (r > l)
{
int mid = l + r >> 1;
if (mini[mid] >= x) r = mid;
else l = mid + 1;
}
return r;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ )
{
scanf("%d", &a[i]);
lang[++ tt ] = a[i];
}
cin >> m;
//下标为i的电影所用的语音
for (int i = 1; i <= m; i ++ )
{
scanf("%d", &b[i]);
lang[++ tt ] = b[i];
}
//下标为i的电影所用的文字
for (int i = 1; i <= m; i ++ )
{
scanf("%d", &c[i]);
lang[++ tt ] = c[i];
}
//排序后存入离散化数组
sort(lang + 1, lang + 1 + tt);
//离散化变小
for (int i = 1; i <= tt; i ++ )
{
if (ee == 0 || lang[i] != lang[i - 1])//避免重复
mini[++ ee] = lang[i];
}
//记录每个电影受众群体有多少
for (int i = 1; i <= n; i ++ )
ans[find(a[i])] ++;
//ans0记录答案,ting,kan记录目前所锁定的答案听懂的和看懂文字的有多少人
//ans1记录枚举到的这个电影能听懂多少人,ans2为看懂
int ans0 = 0, ting = 0, kan = 0, ans1 = 0, ans2 = 0;
for (int i = 1; i <= m; i ++ )
{
ans1 = ans[find(b[i])], ans2 = ans[find(c[i])];
if (ans1 > ting || (ans1 == ting && ans2 > kan))
ans0 = i, ting = ans1, kan = ans2;
}
//若ans0 == 0,则随便选一部电影,就第一步吧
if (ans0 == 0) cout << 1 << endl;
else cout << ans0;
}
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla