电影

题目来源:算法竞赛进阶指南

题目标签:离散化

题目链接:https://www.acwing.com/problem/content/105/

 

方法一:使用map和结构体,先找到语音序列中最大的电影,再在里面找到字幕序列中最大的电影

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#define N 200010
using namespace std;
map<int,int>s;
int a[N];
int b[N];
struct zz
{
    int a;
    int b;
}p[N];
int main()
{
    int n,m,i,j,k;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        //s用来统计a[i]的个数
        s[a[i]]++;
    }
    scanf("%d",&m);
    for(i=1;i<=m;i++)
        scanf("%d",&p[i].a);
    for(i=1;i<=m;i++)
        scanf("%d",&p[i].b);

    int mm=0;k=1;
    for(i=1;i<=m;i++)
    {
        //统计出现次数最多的语言的个数,并记录其在语音列表中---第一次出现-----的位置
        if(mm<s[p[i].a])
        {
            mm=s[p[i].a];
            k=i;
        }
    }

    //统计
    int kk=0;
    for(i=1;i<=m;i++)
    {
        //在mm相等的情况下,比较s[p[i].b]。记录s[p[i].b]最大的位置
        if(s[p[i].a]==mm)
        {
            if(kk<s[p[i].b])
            {
                kk=s[p[i].b];
                k=i;
            }
        }
    }

    printf("%d\n",k);
    return 0;
} 

 

方法二:离散化+二分查找

#include<bits/stdc++.h>
#include<iostream>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=2e5+5;
int n,m;
int a[maxn],b[maxn],c[maxn];
int sum[maxn*3];
int cnt,mm;
int arr[maxn*3],num[maxn*3];

void discrete(){//离散化
    sort(arr+1,arr+cnt+1);
    for(int i=1;i<=cnt;i++){
        if(i==1||arr[i]!=arr[i-1])
            num[++mm]=arr[i];
    }
}
int query(int x){//二分查找x的位置
    return lower_bound(num+1,num+mm+1,x)-num;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){//将所有电影和人涉及的语言放进一个数组,排序并离散化
        scanf("%d",&a[i]);
        arr[++cnt]=a[i];
    }
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        scanf("%d",&b[i]);
        arr[++cnt]=b[i];
    }

    for(int i=1;i<=m;i++){
        scanf("%d",&c[i]);
        arr[++cnt]=c[i];
    }
    discrete();//离散化
    //离散化以后,将所有的语言的坑都填起来


    for(int i=1;i<=n;i++){
        int id=query(a[i]);//统计每种语言的人的数量
        //sum数组类似于map使用,统计n序列中数字的出现个数
        //所以这样看来,还不如直接用map,不用扯什么排序和离散化
        ++sum[id];
    }
    
    int bmax=-1,cmax=-1,ans=0;
    for(int i=1;i<=m;i++){
        //选择满足题目要求的电影
        int x=query(b[i]);
        int y=query(c[i]);
        if(sum[x]>bmax){
            //优先考虑让很高兴的人最多
            bmax=sum[x],cmax=sum[y];
            ans=i;
        }else {
            //否则if是在相等的情况下,则我们可以
            if(sum[x]==bmax&&sum[y]>cmax){
                //如果答案不唯一、则在此前提下再让比较高兴的人最多
                bmax=sum[x],cmax=sum[y];
                ans=i;
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}

 

posted @ 2020-08-11 00:29  锤子科技未来产品经理  阅读(115)  评论(0)    收藏  举报