其他分享
首页 > 其他分享> > 电影

电影

作者:互联网

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)\)

由于给定的数据范围很大,而我们使用的却知识一小部分,所以我们需要离散化将所有的电影进行重新编号即可。

  1. 我们先将所有的电影使用的语言找出来,排序去重。
  2. 我们统计科学家的使用语言,将每一种的语言使用者的人数计数,使用离散化即可完成,将稀疏数组变为稠密数组,即可统计。
  3. 进行比较,先比较能够听懂的,在比较能看懂的,更新最大即可。如果在遍历完所有的电影还没有,随便输出一种电影即可。

时间复杂度

参考文献

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