cinema(全程离散化A题)

cinema

简化题意:
给定 n n n个数字,每个数字在 n n n个数字中出现的次数是数字的价值。
之后给定两串 m m m个数字的序列,上下一一对应,对于每一个 i , i ∈ [ 1 , m ] i,i∈[1,m] ii[1,m]而言,求出上面数字价值最大的 i i i,若有多个上面数字相同,给出下面数字价值最大的编号。
因为给的 a , b , c a,b,c abc中的数字都是在 [ 1 , 1 e 9 ] [1,1e9] [1,1e9]的范围内,所以我们要进行离散化。

思路:离散化之后就可以直接用一个数组进行统计。

易错点

  1. 在离散化的过程中要注意,数组大小是你去重之后的大小;
  2. 在统计答案的时候,注意可能b,c中的数字原本不在你的a数组中,这个时候要加以判断,在加以判断之后要保证该语言可以听懂的科学家的个数为0【2019/9/27】更新;
  3. 要分清楚,谁是原数字,谁是去重之后的下标。

code

//离散化的练习 
#include <bits/stdc++.h>
using namespace std;

const int nn=200003;

int n,m;
int a[nn],ld;
int d[nn],h[nn],s[nn];/*d数组表示的是离散化之后的数值,h数组表示映射关系,s数组表示每一部电影中听懂的人有多少*/
struct people
{
	int x,y,id;
}ans[nn];

inline int read()
{
	int x=0,f=1; char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
	return x*f;
}

void read_d()
{
	n=read();
	for(int i=1;i<=n;++i)	a[i]=read(), d[i]=a[i];
	sort(d+1,d+1+n);
	ld=unique(d+1,d+1+n)-(d+1);
	for(int i=1;i<=n;++i)
	{
		int x;
		x=lower_bound(d+1,d+1+ld,a[i])-d;
		h[x]=a[i];
		s[x]++;
	}
}

bool cmp(people x,people y)
{
	return x.x>y.x||(x.x==y.x&&x.y>y.y);
}

int main()
{
	read_d();
	m=read();
	for(int i=1;i<=m;++i)
	{
		int x=read(); ans[i].id=i;
		int xx=lower_bound(d+1,d+1+ld,x)-d;
		if(h[xx]!=x)	continue;
		ans[i].x=s[xx];
	}
	for(int i=1;i<=m;++i)
	{
		int y=read();
		int yy=lower_bound(d+1,d+1+ld,y)-d;
		if(h[yy]!=y)	continue;
		ans[i].y=s[yy];/*注意这里的标号是yy,而不是y*/
	}
	sort(ans+1,ans+1+m,cmp);
	printf("%d\n",ans[1].id);
	return 0;
}

年轻不是潮牌衣服,不是发型,也不是看流行的电影、演唱会。不管什么年纪,年轻的标准只有一个,那就是,改变自己的能力。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值