首页 > 其他 > 详细

P1102 A?B数对

时间:2018-10-13 00:29:04      阅读:176      评论:0      收藏:0      [点我收藏+]

刷普及-打基础系列。。。

我的第一思路是把这个数组排序并去重,顺便算出去重后的每个数字在原数字中出现多少次。

发现我不会做。。。

然后其实可以有另一种做法:

把这些值扔进一个map里面,统计每个值出现的次数。

然后还是排序去重,在数组中挑出唯一的一个\(B\),在map中找出\(A\)\(B\)出现的次数。所有的这些相乘得到的结果相加就是答案。

附上我感触很深的一句话:开不了的数组,用map!!!

没错呢!map还可以开负数下标的。除了速度有点小慢之外没什么大问题。

其实也不慢的。

代码:

#include<cstdio>
#include<algorithm>
#include<map>
const int maxn = 200005;

int a[maxn];
std::map<int,long long> mmp;
int n, c;
int main()
{
    scanf("%d%d", &n, &c);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        mmp[a[i]] = mmp[a[i]] + 1;
    }
    std::sort(a + 1, a + n + 1);
    int len = std::unique(a + 1, a + n + 1) - a - 1;
    long long ans = 0;
    for(int i = 1; i <= len; i++)
    {
        ans += mmp[a[i]] * mmp[a[i] + c];
    }
    printf("%lld\n", ans);
    return 0;
}

P1102 A?B数对

原文:https://www.cnblogs.com/Garen-Wang/p/9780945.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!