• AcWing 3779. 相等的和


    题目

    给定 k 个整数序列,其中第 i 个序列的长度为 li。
    现在,请你进行以下操作:
    从 k 个序列中,选出两个序列 i,j(i≠j)。
    删掉序列 i 中的一个元素。
    删掉序列 j 中的一个元素。
    要求:操作完成后,序列 i 中的各元素之和等于序列 j 中的各元素之和。
    输出合理操作方案。
    我们规定,空序列的各元素之和为 0。

    输入输出

    输入:第一行包含整数 k,表示共有 k 个序列。
    每个序列的输入占两行。
    第一行包含整数 li,表示序列长度。
    第二行包含 li 个整数 a1,a2,…,ali,表示序列中各元素的值。
    输出:如果不存在合理方案,则输出一行 NO。
    否则首先输出一行 YES。
    随后,第二行输出整数 i 和 x,第三行输出整数 j 和 y,表示选择序列 i 和 j,删除序列 i 中的第 x 个元素以及序列 j 中的第 y 个元素。
    序列和元素下标都从 1 开始。
    输出任意合理方案即可。

    思路

    这道题是一道简单的哈希。记录下每个序列,删除序列中每个元素得到的值,记录在哈希表中,如果表中已有这个值,说明已经找到了两个相等的和。

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <unordered_map>
    
    #define x first
    #define y second
    
    using namespace std;
    
    const int N = 200010;
    typedef pair<int, int> PII;
    
    int a[N];
    
    int main()
    {
        int k;
        cin >> k;
        unordered_map<int,PII> S;
        for (int i = 1; i <= k; i ++ ){
            int l;
            cin >> l;
            int sum = 0;
            for (int j = 1; j <= l; j ++ ){
                cin >> a[j];
                sum += a[j];
            }
            for (int j = 1; j <= l; j ++ ){
                int t = sum - a[j];
                if(S.count(t) && S[t].x != i){
                    cout << "YES" << endl;
                    cout << S[t].x << " " << S[t].y << endl;
                    cout << i << " " << j << endl;
                    return 0;
                }
                S[t] = {i,j};
            }
        }
        cout << "NO" << endl;
        return 0;
    }
    
    作者:inss!w!
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 相关阅读:
    阿里云ECS服务器安装docker
    ActiveMq-常见的问题
    ActiveMq-基础知识
    java语言概述
    【日语词汇类编】自然与人:气候与环境
    【日语词汇类编】传媒与娱乐:大众传播媒介
    机器学习数学基础-线性代数
    掌握机器学习数学基础之概率统计
    机器学习理论篇:机器学习的数学基础
    计算机基础知识
  • 原文地址:https://www.cnblogs.com/Hfolsvh/p/15056409.html
Copyright © 2020-2023  润新知