电影
作者:互联网
1.电影
题目描述
有n个科学家,编号从1~10^9,我们要为他们准备电影,如果能听懂电影的语音最开心,能看懂电影的字幕比较开心,听不懂以及看不懂的不开心,我们要找出最开心的观看电影编号,没有则任意输出即可。
第一行输入一个整数 n,代表科学家的数量。
第二行输入 n 个整数 a1,a2…an,其中 ai 表示第 i个科学家懂得的语言的编号。
第三行输入一个整数 m,代表电影的数量。
第四行输入 m个整数 b1,b2…bm,其中 bi 表示第 i部电影的语音采用的语言的编号。
第五行输入 m 个整数 c1,c2…cm,其中 ci 表示第 i 部电影的字幕采用的语言的编号。
数据范围
1≤n,m≤200000,
1≤ai,bi,ci≤109
样例
3
2 3 2
2
3 2
2 3
2
算法
(离散化+排序) \(O(n^2)\)
由于给定的数据范围很大,而我们使用的却知识一小部分,所以我们需要离散化将所有的电影进行重新编号即可。
- 我们先将所有的电影使用的语言找出来,排序去重。
- 我们统计科学家的使用语言,将每一种的语言使用者的人数计数,使用离散化即可完成,将稀疏数组变为稠密数组,即可统计。
- 进行比较,先比较能够听懂的,在比较能看懂的,更新最大即可。如果在遍历完所有的电影还没有,随便输出一种电影即可。
时间复杂度
参考文献
C++ 代码
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
#include<cstring>
using namespace std;
#define endl "\n"
#define x first
#define y second
#define int long long
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;
int n, m, k;
vector<int> lon;
int a[N], b[N], c[N];
int ans[3*N];
//离散化
int find(int x)
{
int l = 0, r = lon.size();
while(l < r)
{
int mid = l + r >> 1;
if(lon[mid] >= x) r = mid;
else l = mid + 1;
}
return r + 1;
}
signed main()
{
FAST
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> a[i];
lon.push_back(a[i]);
}
cin >> m;
for(int i = 0; i < m; i++)
{
cin >> b[i];
lon.push_back(b[i]);
}
for(int i = 0; i < m; i++)
{
cin >> c[i];
lon.push_back(c[i]);
}
//排序去重,统计所有的语中
sort(lon.begin(), lon.end());
lon.erase(unique(lon.begin(), lon.end()), lon.end());
for(int i = 0; i < n; i++)
{
ans[find(a[i])]++;
}
//ans0存放最佳的电影,ans1存放能听懂的,ans2存放能看懂的。
int ans1 = 0, ans2 = 0, ans0= 0;
for(int i = 0; i < m; i++)
{
int bx = ans[find(b[i])];
int cx = ans[find(c[i])];
//先比较能挺懂的,后比较能看懂的
if(bx > ans1 || (bx == ans1 && cx > ans2))
ans0 = i + 1, ans1 = bx, ans2 = cx;
}
//如果未更新,那么就随便输出即可
if(ans0 == 0)
cout << 1;
else
cout << ans0;
return 0;
}
标签:int,电影,lon,cin,++,include 来源: https://www.cnblogs.com/K-No-Wei/p/16332887.html