1. 程式人生 > >「CF670C」 Cinema 解題報告

「CF670C」 Cinema 解題報告

題面

傳送門

思路:

離散化hash

對於這樣一個明顯的統計排序的題目,當然輕而易舉啦~

但是!看!語言的編號 a陣列和 b陣列的值最大在$10^9$的級別,所以開個陣列來存———That's impossible!

所以我們可以用上離散化(也就是hash)

離散化,我們有兩種寫法

第一種是自己手碼程式碼

先排序,然後去重,接著用二分一一對應,達到離散化的目的

板子:

sort(b+1,b+n+1,cmp);
n=unique(b+1,b+n+1)-b-1;
for(i=1;i<=n;i++)
    a[i]=lower_bound(b+1,b+n+1,a[i])-b;

第二種是使用STL庫的map

標頭檔案:#include <map>

定義方式:map<type,type> p;表示將前一種type對映到後一種type

其中的型別可以很多,比如double,string,int,bool等基本型別,也包括pair這種

map<pair<int,int>,bool>p;允許的

操作:一般用陣列的形式,直接p[x]訪問、寫入

PS:但是map的速度比較慢,想進一步提高可以使用unordered_map

此處不才不做講解,具體詳見洛穀日報

Code:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int b;
int a[200010];
map<int,int> p;
int cur,res,ans;
int read()
{
    int s=0;
    char c=getchar();
    while(!isdigit(c))
        c=getchar();
    while(isdigit(c))
    {
        s=(s<<1)+(s<<3)+c-'0';
        c=getchar();
    }
    return s;
}
int main()
{
    int i;
    int x;
    n=read();
    for(i=1;i<=n;i++)
        p[read()]++;//科(珂)學家們能聽懂的語言
    m=read();
    for(i=1;i<=m;i++)//電影配音
        a[i]=read();
    b=p[read()];
    ans=1;//一開始預設第一種是答案
    res=p[a[1]];
    cur=b;
    for(i=2;i<=m;i++)
    {
        b=p[read()];
        x=p[a[i]];
        if(x>=res)//比較聽的懂配音,看的懂字幕的人數
        {
            if(x>res)
            {
                res=x;
                cur=b;
                ans=i;
            }
            else
                if(cur<b)
                {
                    ans=i;
                    cur=b;
                }
        }
    }
    printf("%d",ans);//跑過138個點!人憔悴~
    return 0;
}

推薦題目:

「Luogu」[NOI2015]程式自動分析