电影

 

 

解法一: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 }

 

posted @ 2020-11-09 16:41  kyk333  阅读(62)  评论(0)    收藏  举报