Codeforces DIV2 670C Cinema(离散化)

Codeforces DIV2 670C Cinema(离散化)

题意:

有n个科学家,每个科学家会一个语言。

有m个电影,每个电影有一个音频语言和一个字幕的语言

输出最多人能听懂的电影的索引,如果有多个电影有相同的人数能听懂,则输出在此条件下最多人能看懂的一个,如果还有多个电影符合,输出任意

思路:

​ 可以直接用map写

​ 这里用离散化。数据范围2e5个科学家,且每个人只会一种语言。但是数据大小为1e9,所以我们可以离散化到一个计数数组中,然后再根据题意对其排序,如果lower_bound返回的下标等于查找值,则代表当前语言没有人会,语言编号始终大于0,所以我们把不会的语言指向cnt[0],将其设定为-1,进行排序即可

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 2e5+10;
struct mov
{
	int index;
	int sp;
	int sub;
}a[maxn];
int b[maxn], index[maxn],cnt[maxn];
int n,t;
int find(int x) {
	int ind = lower_bound(index+1, index + t+1, x) - index;
	if (index[ind] != x) {
		return 0;
	}
	return ind;
}
int main(void) {
	scanf("%d", &n);
	for (int i = 1; i <=n; i++) {
		scanf("%d", b + i);
		index[i] = b[i];
	}
	sort(index+1, index + n+1);
	t=unique(index+1, index + n+1)-index-1;//获取去重后的元素个数
	sort(b+1, b + n+1);
	for (int i = 1; i <= n; i++) {
		cnt[find(b[i])]++;
	}
	int m;
	scanf("%d", &m);
	for (int i = 0; i < m; i++) {
		scanf("%d", &a[i].sp);
		a[i].index = i + 1;
	}
	for (int i = 0; i < m; i++) {
		scanf("%d", &a[i].sub);
	}
	cnt[0] = -1;
	sort(a, a + m, [](mov a, mov b)->bool {
		if (cnt[find(a.sp)] == cnt[find(b.sp)]) {
			return cnt[find(a.sub)] > cnt[find(b.sub)];
			}
		return cnt[find(a.sp)] > cnt[find(b.sp)];
		});
	printf("%d", a[0].index);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值