• CF670C Cinema


    前置芝士

    (vector)进行离散化:

    #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++)标准库函数里面的函数,其功能是去除相邻的重复元素(只保留一个),所以使用前需要对数组进行排序(升序降序均可),具体使用如下:

    对于长度为(n)数组(a)(unique(a+1,a+n+1))返回的是迭代器,迭代器指向的是重复元素的首地址

    如果非要得到不重元素的个数,可以用 (unique(a+1,a+n+1) -a - 1)表示;

    下面举个栗子:

    比如这是去重前已排好序的数:

    1 1 1 2 3 4 4 5

    那么unique一遍后,就会得到如下的数组:

    1 2 3 4 5 1 1 4

    从这里可以看出(unique)只是帮你整理出不重复元素,重复的元素还是码放在后面

    所以这时就要用到(erase),删除(a[v.begin()] - a[v.end()-1])

    然后就可以写一个(query)函数找出某个数被离散化成了什么

    关于这道题

    1. (m)部电影和(n)个珂学家最多有(m imes 2+ n)种语言,我们把所有涉及的语言(push)(v)里面,排序并进行离散化,

    2. 然后开个(2 imes 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;
    }
    
    
  • 相关阅读:
    集合
    16
    最常使用Eclipse快捷键
    Java小菜的进阶之路(异常捕获与处理(一))
    0803作业
    0801作业
    java中this与super的见解
    7.27作业
    7.23作业
    java内部类的浅谈(错误之处还请见谅!)
  • 原文地址:https://www.cnblogs.com/p-z-y/p/11720377.html
Copyright © 2020-2023  润新知