ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

电影

2022-06-01 00:33:27  阅读:165  来源: 互联网

标签:int 电影 lon cin ++ include


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有