原题链接:https://codeforces.com/problemset/problem/670/C
题目大意:
有 n 个人,每人会且仅会一种语言. (n ≤ 2e5)
语言有各自的编号(≤ 1e9)
这些人去看电影,一共有 m 种电影. (m ≤ 2e5)
每个电影的声音与字幕语言都不一样.
若有人的语言与声音语言一样,则称这个人很高兴♂.
若有人的语言与字幕语言一样,则称这个人比较高兴.
现让你选择一场电影,使得此电影中,很高兴的人最多,在此条件下,再使比较高兴的人最多.
分析:
因为要统计每种语言的人数,而语言编号 ≤ 1e9,存不下.
所以考虑离散化.
可得离散化之后,语言总数最多 n + 2m 种.
AC代码:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 2e5 + 5;
int n, m;
int a[maxn], b[maxn], c[maxn];
int sum[maxn * 3];
int cnt, mm;
int arr[maxn * 3], num[maxn * 3];
void discrete() {//离散化
sort(arr + 1, arr + cnt + 1);
for (int i = 1; i <= cnt; i++) {
if (i == 1 || arr[i] != arr[i - 1])
num[++mm] = arr[i];
}
}
int query(int x) {//二分查找x的位置
return lower_bound(num + 1, num + mm + 1, x) - num;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {//将所有电影和人涉及的语言放进一个数组,排序并离散化
scanf("%d", &a[i]);
arr[++cnt] = a[i];
}
scanf("%d", &m);
for (int i = 1; i <= m; i++) {
scanf("%d", &b[i]);
arr[++cnt] = b[i];
}
for (int i = 1; i <= m; i++) {
scanf("%d", &c[i]);
arr[++cnt] = c[i];
}
discrete();//离散化
for (int i = 1; i <= n; i++) {
int id = query(a[i]);//统计每种语言的人的数量
++sum[id];
}
int bmax = -1, cmax = -1, ans = 0;
for (int i = 1; i <= m; i++) {//选择满足题目要求的电影
int x = query(b[i]);
int y = query(c[i]);
if (sum[x] > bmax) {//优先考虑让很高兴的人最多
bmax = sum[x], cmax = sum[y];
ans = i;
}
else {
if (sum[x] == bmax && sum[y] > cmax) {//如果答案不唯一、则在此前提下再让比较高兴的人最多
bmax = sum[x], cmax = sum[y];
ans = i;
}
}
}
printf("%d\n", ans);
return 0;
}
暴力解法:670ms
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int>PII;
int n, m;
int a[20000005];
map<int, int>mp;
int main() {
//freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0);
cin >> n;
for (int i = 1, a; i <= n; ++i)
cin >> a, mp[a]++;
int k, max1 = -1, max2 = -1;
cin >> m;
for (int i = 1; i <= m; ++i) {
cin >> a[i];
max1 = max(max1, mp[a[i]]);
}
for (int i = 1,b; i <= m; ++i) {
cin >> b;
if (mp[a[i]] == max1 && mp[b] > max2)
max2 = mp[b], k = i;
}
cout << k << endl;
}
The desire of his soul is the prophecy of his fate
你灵魂的欲望,是你命运的先知。