【洛谷 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;
}
目录
相关文章
|
3月前
剑指Offer LeetCode 面试题40. 最小的k个数
剑指Offer LeetCode 面试题40. 最小的k个数
31 0
|
3月前
|
机器学习/深度学习 算法 测试技术
【单调栈】LeetCode:2818操作使得分最大
【单调栈】LeetCode:2818操作使得分最大
【力扣每日一题:2-19】1004. 最大连续1的个数 III【中等】
【力扣每日一题:2-19】1004. 最大连续1的个数 III【中等】
|
3月前
剑指Offer LeetCode 面试题11. 旋转数组的最小数字
剑指Offer LeetCode 面试题11. 旋转数组的最小数字
31 0
Leecode面试题40. 最小的k个数
Leecode面试题40. 最小的k个数
55 0
|
人工智能 算法 vr&ar
每日算法系列【LeetCode 1004】最大连续1的个数 III
每日算法系列【LeetCode 1004】最大连续1的个数 III
Leetcode-每日一题769. 最多能完成排序的块(贪心)
需要怎么分割序列才是个问题,题目其实给了提示因为序列里的数只能是[0, n-1]所以选择[l, r] 连续的序列中的数一定是 [l, r] 这段区间的数字,所以我们只需要遍历数组,去找这段区间内最大的数字,即边界值r,因为他才是决定边界的数字,每次我们到达了r这个位置就表示下一段区间。
56 0
Leetcode-每日一题769. 最多能完成排序的块(贪心)
【力扣每日一题:8-04】611. 有效三角形的个数【中等】
【力扣每日一题:8-04】611. 有效三角形的个数【中等】
|
Serverless
LeetCode每日一题题解:540. 有序数组中的单一元素
LeetCode每日一题题解:540. 有序数组中的单一元素
|
算法 PHP
力扣(LeetCode)算法题解:1464. 数组中两元素的最大乘积
力扣(LeetCode)算法题解:1464. 数组中两元素的最大乘积
107 0