CF670C Cinema

前置芝士

\(vector\)進行離散化:ios

#include<bits/stdc++.h>
using namespace std;
int n,a[10005],c[10005];
//c[]即儲存離散化後的數 
vector<int>v;
inline int query(int x){return lower_bound(v.begin(),v.end(),x)-v.begin()+1;}
int main()
{
    scanf("%d",&n);
    for(register int i=1;i<=n;++i) 
        scanf("%d",&a[i]),v.push_back(a[i]);
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    for(int i=1;i<=n;++i) c[i]=query(a[i]);
}

\(unique()\)\(C++\)標準庫函數裏面的函數,其功能是去除相鄰的重複元素(只保留一個),因此使用前須要對數組進行排序(升序降序都可),具體使用以下:c++

對於長度爲\(n\)數組\(a\)\(unique(a+1,a+n+1)\)返回的是迭代器,迭代器指向的是重複元素的首地址數組

若是非要獲得不重元素的個數,能夠用 \(unique(a+1,a+n+1) -a - 1\)表示;函數

下面舉個栗子:this

好比這是去重前已排好序的數:spa

1 1 1 2 3 4 4 5

那麼unique一遍後,就會獲得以下的數組:code

1 2 3 4 5 1 1 4

從這裏能夠看出\(unique\)只是幫你整理出不重複元素,重複的元素仍是碼放在後面排序

因此這時就要用到\(erase\),刪除\(a[v.begin()] - a[v.end()-1]\)get

而後就能夠寫一個\(query\)函數找出某個數被離散化成了什麼it

關於這道題

  1. \(m\)部電影和\(n\)個珂學家最多有\(m \times 2+ n\)種語言,咱們把全部涉及的語言\(push\)\(v\)裏面,排序並進行離散化,

  2. 而後開個\(2 \times m + n\)的數組去統計每一個人會的語言,

  3. 最後枚舉每一個電影判斷.

\(Code:\)


#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define ll long long
#define rg register
struct ios{
    template<typename TP>
    inline ios operator >> (TP &x)
    {
        TP f=1;x=0;rg char c=getchar();
        for(;c>'9' || c<'0';c=getchar()) if(c=='-') f=-1;
        for(;c>='0' && c<='9';c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
        x*=f;
        return *this;
    }
    template<typename TP>
    inline ios operator << (TP x)
    {
        int top=0,s[66];
        if(x<0) x=-x,putchar('-');
        if(!x) putchar('0');
        while(x) s[++top]=x%10+'0',x/=10;
        while(top) putchar(s[top--]);
        return *this;
    }
    inline ios operator << (char s)
    {
        putchar(s);
        return *this;
    }
}io;
const int N=2e5+5;
int a[N],s[N],n,t,index[N*3],m,r[N],maxx=-1,maxy=-1,ans=1;

//a[]表示電影語言,s[]表示電影字幕,r[]爲人的語言,maxx是最多有幾我的聽得懂,maxy表示有幾我的看得懂

//可能有沒有人能聽懂或看懂這樣的數據,因此就把ans初值置爲1
vector<int>v;
inline int query(int x) {return lower_bound(v.begin(),v.end(),x)-v.begin()+1;}
int main()
{
    io>>n;
    for(rg int i=1;i<=n;++i) io>>r[i],v.push_back(r[i]);
    io>>m;
    for(rg int i=1;i<=m;++i) io>>a[i],v.push_back(a[i]);
    for(rg int i=1;i<=m;++i) io>>s[i],v.push_back(s[i]);
    sort(v.begin(),v.end()),v.erase(unique(v.begin(),v.end()),v.end());
    for(rg int i=1;i<=n;++i) ++index[query(r[i])];
    for(rg int i=1;i<=m;++i)
    {
        int x=query(a[i]),y=query(s[i]);
        if(index[x]>maxx) maxx=index[x],maxy=index[y],ans=i;
        //若是兩部電影能聽懂的人同樣多,就比較能看懂字幕的人的多少
        else if(index[x]==maxx&&index[y]>maxy) maxy=index[y],ans=i;
    }
    io<<ans;
    return 0;
}
相關文章
相關標籤/搜索