3779 相等的和(哈希表)

1. 问题描述:

给定 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 开始。输出任意合理方案即可。

数据范围

前三个测试点满足 2 ≤ k ≤ 5,1 ≤ li ≤ 10。
全部测试点满足 2 ≤ k ≤ 2 × 10 ^ 5,1 ≤ li < 2 × 10 ^ 5,−10 ^ 4 ≤ ai ≤ 10 ^ 4。
同一测试点内所有 li 之和不超过 2 × 10 ^ 5。

输入样例1:

2
5
2 3 1 3 2
6
1 1 2 2 2 1

输出样例1:

YES
2 6
1 2

输入样例2:

3
1
5
5
1 1 1 1 1
2
2 3

输出样例2:

NO

输入样例3:

4
6
2 2 2 2 2 2
5
2 2 2 2 2
3
2 2 2
5
2 2 2 2 2

输出样例3:

YES
2 2
4 1
来源:https://www.acwing.com/problem/content/description/3782/

2. 思路分析:

因为需要选择两个序列使得删掉序列中其中一个元素剩余的元素和相等,所以我们可以枚举所有的序列,对于当前的序列,枚举删除掉当前的元素计算剩余元素的总和,这样我们可以得到所有序列删除掉其中一个元素的剩余元素和,我们需要在不同行找到两个相同的数字,也即需要判断两个数字是否存在,判断某个数字是否存在可以使用哈希表;我们可以枚举所有的序列,在枚举当前序列的过程中枚举删除掉某一个数字,判断删除掉当前元素之后剩余元素和是否在之前出现过并且不是同一行的相等的总和,如果存在说明找到了一个方案直接输出结果即可。

3. 代码如下:

class Solution:
    def process(self):
        m = int(input())
        # 字典的值为元组类型, 第一个元素为选择的哪一个序列, 第二个元素为当前序列的操作下标
        mp = dict()
        for i in range(m):
            n = int(input())
            a = list(map(int, input().split()))
            s = 0
            # 计算当前序列所有元素的和
            for x in a:
                s += x
            # 枚举删除当前序列的元素
            for j in range(n):
                t = s - a[j]
                if t in mp and mp[t][0] != i + 1:
                    print("YES")
                    print(mp[t][0], mp[t][1])
                    print(i + 1, j + 1)
                    return
                mp[t] = (i + 1, j + 1)
        print("NO")


if __name__ == '__main__':
    Solution().process()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值