【洛谷 P1102】A-B 数对 题解(映射)

简介: 这是一个编程题目,要求计算给定正整数序列中满足 \( A - B = C \) 的数对个数。输入包含两行:正整数 \( N \) 和 \( C \),以及一串正整数。使用一个哈希映射记录每个数字出现的次数,然后遍历映射,如果找到 \( A = B + C \),则累加对应计数。样例输入输出为 \( N=4, C=1 \),数列为 \( 1 1 2 3 \),答案为 \( 3 \)。代码使用 C++ 实现,通过维护一个映射来存储数字频率并计算数对。

A-B 数对

题目背景

出题是一件痛苦的事情!

相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!

题目描述

给出一串正整数数列以及一个正整数 $C$,要求计算出所有满足 $A - B = C$ 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入格式

输入共两行。

第一行,两个正整数 $N,C$。

第二行,$N$ 个正整数,作为要求处理的那串数。

输出格式

一行,表示该串正整数中包含的满足 $A - B = C$ 的数对的个数。

样例 #1

样例输入 #1

4 1
1 1 2 3

样例输出 #1

3

提示

对于 $75\%$ 的数据,$1 \leq N \leq 2000$。

对于 $100\%$ 的数据,$1 \leq N \leq 2 \times 10^5$,$0 \leq a_i <2^{30}$,$1 \leq C < 2^{30}$。

2017/4/29 新添数据两组

思路

A - B = C 转化为 A = B + C。用map记录数字出现的次数。
若在map中,查找到存在A = B + C ,计数器加上A出现的次数与B出现的次数的乘积。

AC代码

#include <iostream>
#include <map>
#define AUTHOR "HEX9CF"
using namespace std;

int n, c;
long long cnt = 0;
map<int, long long> m;

int main()
{
   
    cin >> n >> c;
    for (int i = 0; i < n; i++)
    {
   
        int t;
        cin >> t;
        m[t]++;
    }
    map<int, long long>::iterator it = m.begin(), fit;
    for (; it != m.end(); it++)
    {
   
        // cout << it->first << " " << it->second << endl;
        if (m.end() != (fit = m.find(it->first + c)))
        {
   
            cnt += it->second * fit->second;
        }
    }
    cout << cnt << endl;
    return 0;
}
目录
相关文章
|
2月前
剑指Offer LeetCode 面试题40. 最小的k个数
剑指Offer LeetCode 面试题40. 最小的k个数
27 0
|
29天前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
14天前
|
C++
【洛谷 P1125】[NOIP2008 提高组] 笨小猴 题解(字符串+映射+集合)
**摘要:** 在NOIP2008提高组的“笨小猴”问题中,需检查单词中出现次数最多和最少的字母频率差是否为质数。若差值为质数,输出&quot;Lucky Word&quot;及该差值;否则,输出&quot;No Answer&quot;和0。给定AC代码使用C++,通过映射统计字符频率,集合找出最大和最小值,并通过函数判断差值是否为质数。
10 0
|
21天前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【力扣每日一题:2-19】1004. 最大连续1的个数 III【中等】
【力扣每日一题:2-19】1004. 最大连续1的个数 III【中等】
|
2月前
蓝桥杯 1的个数
蓝桥杯 1的个数
24 0
|
8月前
|
算法 索引
代码随想录算法训练营第二天 |977.有序数组平方,209.长度最小的字数组,59.螺旋矩阵
代码随想录算法训练营第二天 |977.有序数组平方,209.长度最小的字数组,59.螺旋矩阵
|
人工智能 算法 vr&ar
每日算法系列【LeetCode 1004】最大连续1的个数 III
每日算法系列【LeetCode 1004】最大连续1的个数 III
(树状数组,线段树)(数组模拟哈希)(解题步骤)acwing数星星
(树状数组,线段树)(数组模拟哈希)(解题步骤)acwing数星星
79 0
Leetcode-每日一题769. 最多能完成排序的块(贪心)
需要怎么分割序列才是个问题,题目其实给了提示因为序列里的数只能是[0, n-1]所以选择[l, r] 连续的序列中的数一定是 [l, r] 这段区间的数字,所以我们只需要遍历数组,去找这段区间内最大的数字,即边界值r,因为他才是决定边界的数字,每次我们到达了r这个位置就表示下一段区间。
54 0
Leetcode-每日一题769. 最多能完成排序的块(贪心)

热门文章

最新文章