简化题意:
给定
n
n
n个数字,每个数字在
n
n
n个数字中出现的次数是数字的价值。
之后给定两串
m
m
m个数字的序列,上下一一对应,对于每一个
i
,
i
∈
[
1
,
m
]
i,i∈[1,m]
i,i∈[1,m]而言,求出上面数字价值最大的
i
i
i,若有多个上面数字相同,给出下面数字价值最大的编号。
因为给的
a
,
b
,
c
a,b,c
a,b,c中的数字都是在
[
1
,
1
e
9
]
[1,1e9]
[1,1e9]的范围内,所以我们要进行离散化。
思路:离散化之后就可以直接用一个数组进行统计。
易错点:
- 在离散化的过程中要注意,数组大小是你去重之后的大小;
- 在统计答案的时候,注意可能b,c中的数字原本不在你的a数组中,这个时候要加以判断,在加以判断之后要保证该语言可以听懂的科学家的个数为0【2019/9/27】更新;
- 要分清楚,谁是原数字,谁是去重之后的下标。
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;
}
年轻不是潮牌衣服,不是发型,也不是看流行的电影、演唱会。不管什么年纪,年轻的标准只有一个,那就是,改变自己的能力。