zoukankan      html  css  js  c++  java
  • Codeforces 670C (离散化入门题)

    原题链接: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;
    }
    
  • 相关阅读:
    深挖 GIL锁
    numpy小入门
    IPython和Jupyter notebook
    LINUX+Vmware+SVN的配置和安装
    windows下使用火狐浏览器插件AutoProxy+MyEnTunnel+SSH访问海外站点(转)
    无法打开键: UNKNOWNComponentsBE1FB738077DBE490AF18C3B9B1A1EE8E5F5286B58B542741A00A0A9AA420B27
    如何将软件测试和数据库联系在一起(转)
    接口测试第十二课(fidller过滤)(转)
    android、IOS和手机基础知识
    广州女生手机被偷 里面的身份证出卖了支付宝密码丨丢手机后必做6件事(转)
  • 原文地址:https://www.cnblogs.com/RioTian/p/13458315.html
Copyright © 2011-2022 走看看