zoukankan      html  css  js  c++  java
  • 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 许可协议。转载请注明出处!
  • 相关阅读:
    1775. [国家集训队2010]小Z的袜子
    面试经典-分金条
    你的话信用度太低,说出来就像喝水一样容易
    uvalive 3971
    lua学习:使用Lua处理游戏数据
    每一次量体重。轻了就对自己说:瘦了。重了就对自己说: 胸部大了
    啊华北哦好咕~~(╯﹏╰)b
    啊别怪我好
    阿尔宾观海卫哦
    面试经典--两个房间 每间房间三盏灯
  • 原文地址:https://www.cnblogs.com/Hfolsvh/p/15056409.html
Copyright © 2011-2022 走看看