解法一:unordered_map 加 双关键字排序
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 200010; 4 int n, m; 5 int scientist[N]; //存储科学家明白的语言 6 struct movie { 7 int id; //电影编号 8 int sound; //电影的语音 9 int word; //电影的字幕 10 int people_sound; //能明白这部电影语音的人数 11 int people_word; //能明白这部电影字幕的人数 12 } movies[N]; 13 bool cmp(movie m1, movie m2) { //双关键字排序 14 if (m1.people_sound != m2.people_sound) { 15 return m1.people_sound > m2.people_sound; 16 } 17 return m1.people_word > m2.people_word; 18 } 19 int main() { 20 ios::sync_with_stdio(false); 21 cin.tie(0); 22 cout.tie(0); 23 unordered_map<int, int> mp; //first是语言,second是明白这个语言的人数 24 cin >> n; 25 for (int i = 0; i < n; i++) { 26 cin >> scientist[i]; 27 mp[scientist[i]]++; 28 } 29 cin >> m; 30 for (int i = 0; i < m; i++) { 31 movies[i].id = i + 1; 32 } 33 for (int i = 0; i < m; i++) { 34 int t1; 35 cin >> t1; 36 movies[i].sound = t1; 37 movies[i].people_sound = mp[t1]; 38 } 39 for (int i = 0; i < m; i++) { 40 int t2; 41 cin >> t2; 42 movies[i].word = t2; 43 movies[i].people_word = mp[t2]; 44 } 45 sort(movies, movies + m, cmp); 46 cout << movies[0].id << endl; 47 return 0; 48 }
解法二:离散化。其实对于本题来说,用离散化来做是更麻烦了。
不过练练手还是可以的
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 200010; 4 int n, m; 5 int a[N], b[N], c[N]; 6 int sum[N]; //相当于map,用于计数 7 int cnt1, cnt2; 8 //cnt1是待离散化(arr)的数的数量 9 //cnt2是离散化(num)后的数的数量 10 int arr[N * 3], num[N * 3]; 11 //arr是待离散化的数组 12 //num是离散化后的数组 13 void discrete() { //离散化 14 sort(arr + 1, arr + cnt1 + 1); 15 for (int i = 1; i <= cnt1; i++) { 16 if (i == 1 || arr[i] != arr[i - 1]) { 17 num[++cnt2] = arr[i]; 18 } 19 } 20 } 21 int query(int x) { //二分查找x的位置 22 return lower_bound(num + 1, num + cnt2 + 1, x) - num; 23 } 24 int main() { 25 ios::sync_with_stdio(false); 26 cin.tie(0); 27 cout.tie(0); 28 cin >> n; 29 for (int i = 1; i <= n; i++) { 30 cin >> a[i]; 31 arr[++cnt1] = a[i]; //放进arr数组,排序并离散化 32 } 33 cin >> m; 34 for (int i = 1; i <= m; i++) { 35 cin >> b[i]; 36 arr[++cnt1] = b[i]; //放进arr数组,排序并离散化 37 } 38 for (int i = 1; i <= m; i++) { 39 cin >> c[i]; 40 arr[++cnt1] = c[i]; //放进arr数组,排序并离散化 41 } 42 discrete();//离散化 43 for (int i = 1; i <= n; i++) { 44 int id = query(a[i]); //统计每种语言的人的数量 45 //sum数组类似于map使用,统计n序列中数字的出现个数 46 sum[id]++; 47 } 48 int bmax = -1, cmax = -1, ans = 0; 49 for (int i = 1; i <= m; i++) { //选择满足题目要求的电影 50 int x = query(b[i]); 51 int y = query(c[i]); 52 if (sum[x] > bmax) { //优先考虑让很高兴的人最多 53 bmax = sum[x]; 54 cmax = sum[y]; 55 ans = i; 56 } else { 57 //否则if是在相等的情况下,则我们可以 58 if (sum[x] == bmax && sum[y] > cmax) { 59 //如果答案不唯一、则在此前提下再让比较高兴的人最多 60 bmax = sum[x]; 61 cmax = sum[y]; 62 ans = i; 63 } 64 } 65 } 66 cout << ans << endl; 67 return 0; 68 }