zoukankan      html  css  js  c++  java
  • 电影

     

     

    解法一: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 }
  • 相关阅读:
    裸裸的spfa~嘿嘿嘿!
    睡前1小时数学系列之-整除
    拓扑排序1.奖金
    拓扑排序
    SCU 1095运送物资(最短路)
    POJ1158 城市交通Traffic lights IOI 1999 (最短路)
    POI0109 POD (最短路)
    HN0I2000最优乘车 (最短路变形)
    FOJ1205 小鼠迷宫问题 (BFD+递推)
    CJOI 05新年好 (最短路+枚举)
  • 原文地址:https://www.cnblogs.com/fx1998/p/13949331.html
Copyright © 2011-2022 走看看