zoukankan      html  css  js  c++  java
  • A-B数对 (hash映射)

    题目大意:

    第一行输入N,C
    第二行输入n个数字
    输出,求A - B = C的数对个数

    样例

    4 1
    1 1 2 3

    输出

    3

    思路:用STL容器map,map<num, times>,建立一个数字出现的次数的映射,题目要求是A - B = C,我们将其转换成A - C = B,并且将a数组依次减去C,最后再将A扫描一遍,将所有映射的次数加起来就是结果res

    代码

    #include <map>
    #include <cstdio>
    #include <iostream>
    
    using namespace std;
    
    const int N = 200010;
    typedef long long LL;
    LL a[N];
    map<LL, LL> mp;
    
    int main()
    {
        int n;
        LL res = 0, c;
    
        scanf("%d%d", &n, &c);
        for(int i = 1; i <= n; i++)
        {
            scanf("%d", &a[i]);
            mp[a[i]]++;
            a[i] -= c;
        }
    
        for(int i = 1; i <= n; i++) res += mp[a[i]];
    
        printf("%d", res);
        system("pause");
        return 0;
    }
    

    这个思路很巧妙,原理想了很久~但是理解的还不是很透彻,个人理解:假设a数组中减去数之后变为b数组,那么若想要原数组a中的产生A - B = C数对,那么b数组中的数也一定存在于原来的a数组,因此可以直接遍历a数组进行计数

    按照题给样例
    为了更好理解 a[]数组挨个减去C之后变成b[]数组
    a[1] = 1; C = 1 那么a[]数组中还需要一个元素 0 才能与 1 构成数对,但是 0 并不存在,因此b[1] = 0,即mp[0] = 0;
    a[2] = 1; C = 1 同理b[2] = 0,mp[0] = 0.
    a[3] = 2; C = 1 那么a[]数组中需要一个 1 才能与 2 构成数对,刚好 1 有两个,b[3] = 1,即mp[1] = 2;
    a[4] = 3; C = 1 那么a[]数组需要一个 2 才能与 3 构成数对, 刚好 2 有一个,b[4] = 2,即mp[2] = 1;
    因此res = mp[0] + mp[0] + mp[1] + mp[2] = 3

  • 相关阅读:
    oracle--角色权限
    oracle--权限的传递
    oracle--少见操作、如何调整dos窗口大小、字符集设置
    oracle--对象权限
    oracle-系统权限管理
    IOS-swift5.1快速入门之旅
    oracle--用户区别sys和system
    JSP基础--EL表达式
    JSP基础--javaBean
    hdu_A Walk Through the Forest ——迪杰特斯拉+dfs
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/13398932.html
Copyright © 2011-2022 走看看