查看: 12|回复: 0

洛谷P1102题解:A-B数对问题的高效解法

[复制链接]
  • TA的每日心情
    无聊
    4 小时前
  • 签到天数: 44 天

    [LV.5]常住居民I

    43

    主题

    0

    回帖

    74

    积分

    注册会员

    Rank: 2

    积分
    74
    发表于 昨天 15:26 | 显示全部楼层 |阅读模式
    一、问题描述
    给定N个整数和一个整数C,要求统计所有满足A-B=C的数对(A,B)的数量。其中A和B都是给定数组中的元素,且位置可以相同。
    二、算法核心思想
    • 哈希表统计:使用unordered_map统计每个数字出现的次数
    • 线性扫描:遍历数组,对每个元素A,查找满足B=A-C的元素B的数量
    • 累加结果:将所有满足条件的B的数量累加得到最终结果

    三、完整代码实现(带详细注释)
    1. #include <iostream>
    2. #include <unordered_map>
    3. #include <algorithm>
    4. using namespace std;

    5. const int MAXN = 2e5 + 5;  // 定义最大数组大小
    6. long long nums[MAXN];      // 存储输入数字的数组

    7. int main() {
    8.     int n;                 // 数字个数
    9.     long long c;           // 目标差值C
    10.     cin >> n >> c;         // 输入n和c
    11.    
    12.     // 使用哈希表统计每个数字出现的次数
    13.     unordered_map<long long, int> countMap;
    14.     for(int i = 0; i < n; i++) {
    15.         cin >> nums[i];            // 读取数字
    16.         countMap[nums[i]]++;       // 统计该数字出现次数
    17.     }
    18.    
    19.     long long res = 0;             // 初始化结果计数器
    20.     for(int i = 0; i < n; i++) {
    21.         long long target = nums[i] + c;  // 计算需要的B值(A-B=C => B=A-C)
    22.         res += countMap[target];         // 累加满足条件的B的数量
    23.     }
    24.    
    25.     cout << res << endl;           // 输出结果
    26.     return 0;
    27. }
    复制代码


    四、算法分步解析
    • 输入处理

      • 读取数字个数n和目标差值c
      • 定义足够大的数组存储输入数字

    • 统计频率

      • 使用unordered_map统计每个数字出现的次数
      • 哈希表的平均插入和查询时间复杂度为O(1)

    • 计算结果

      • 遍历数组中的每个数字作为A
      • 计算对应的B值(B=A-C)
      • 通过哈希表快速查询B的出现次数并累加

    • 输出结果

      • 打印满足条件的数对总数

    来源:洛谷题解

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表