排序1 电影

该博客讨论了一种电影选择算法,根据听懂和看懂人数最多的原则进行排序。通过使用结构体存储电影信息,并对语言进行离散化处理,以解决大范围语言问题。在C++中实现了一个比较函数,对电影进行排序,最终输出排序后的第一项电影编号。该文章涉及到了数据结构、算法优化以及数组和映射在解决问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
如何选择电影:
1.听懂人数最多的。
2.若有多部电影的听懂人数均最多,选看懂字幕人数最多的。
3.若仍有多种选择,输出任意一个。
所以我们可以用一个结构体来存电影信息:
电影语音、电影字幕、电影编号、能听懂的人数、能看懂的人数。
接着按照上面选择电影的规则写一个比较函数(见代码),对电影排序之后,第一部电影就是答案,输出该电影的编号即可。
如何算一部电影有多少人能听懂看懂,其实可以转变为某种语言有多少人懂。我们可以建立一个数组来存每种语言有多少人懂。但是本题的语言的范围是1e9,我们肯定不能创建大小为1e9的数组。但是人数和电影数量只有2e5,那最多只会出现6e5种不同的语言,所以我们对语言进行离散化即可。
离散化可以用vector+map,也可以选择其他方案。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
struct Film{
    int x,y,id;
}f[N];
bool operator<(const Film&a,const Film&b){
    if(a.x==b.x)return a.y>b.y;
    return a.x>b.x;
}
vector<int>vec;
map<int,int>mp;
int n,m;
int a[N];
int s[N*3];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        vec.push_back(a[i]);
    }
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        scanf("%d",&f[i].x);
        f[i].id=i;
        vec.push_back(f[i].x);
    }
    for(int i=1;i<=m;i++){
        scanf("%d",&f[i].y);
        vec.push_back(f[i].y);
    }
    sort(vec.begin(),vec.end());
    int t=vec.erase(unique(vec.begin(),vec.end()),vec.end())-vec.begin();
    for(int i=0;i<t;i++)mp[vec[i]]=i;
    for(int i=1;i<=n;i++){
        s[mp[a[i]]]++;
    }
    for(int i=1;i<=m;i++){
        f[i].x=s[mp[f[i].x]];
        f[i].y=s[mp[f[i].y]];
    }    
    sort(f+1,f+1+m);
    printf("%d",f[1].id);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值