离散化

作者: Tsukinousag | 来源:发表于2021-01-30 19:23 被阅读0次

    电影

    原题链接

    具体离散化的用处—>传送门

    给出一堆科学家擅长的语言,给出电影,电影有科学家喜欢的,一般的,否则都不喜欢,进行匹配,将所有信息放到一个数组里,排序去重离散化,再用科学家的信息去二分查找匹配用sum数组记录,最后优先让喜欢的匹配的多,其次是比较喜欢的

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N=1e6+10;
    
    int a[N],b[N],c[N];
    int arr[3*N],cnt[3*N],sum[3*N];
    int n,t=0,mm=0,m;
    
    //离散化
    void discrete()
    {
        sort(arr+1,arr+t+1);
        for(int i=1;i<=t;i++)
        {
            if(i==1||arr[i]!=arr[i-1])
                cnt[++mm]=arr[i];
        }
    }
    
    //二分查找离散化的位置
    int query(int x)
    {
        return lower_bound(cnt+1,cnt+mm+1,x)-cnt;
    }
    
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            arr[++t]=a[i];
        }
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&b[i]);
            arr[++t]=b[i];
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&c[i]);
            arr[++t]=c[i];
        }
        //离散化
        discrete();
        //二分查找统计
        for(int i=1;i<=n;i++)//统计每种语言的人的数量
        {
            int id=query(a[i]);
            ++sum[id];
        }
        //开始匹配
        //bmax很高兴的人多,cmax让比较开心的人多
        int bmax=-1,cmax=-1,ans=0;
        for(int i=1;i<=m;i++)
        {
            int s1=query(b[i]);
            int s2=query(c[i]);
            if(sum[s1]>bmax)//高兴的人多的情况下就选
            {
                bmax=sum[s1];
                cmax=sum[s2];
                ans=i;
            }
            else if(sum[s1]==bmax&&sum[s2]>cmax)//高兴的人相同时,就选比较开心的人多的那边
            {
                bmax=sum[s1];
                cmax=sum[s2];
                ans=i;
            }
        }
        printf("%d\n",ans);
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:离散化

          本文链接:https://www.haomeiwen.com/subject/frektltx.html