题意:输入k个序列,每个序列长度不定,每个序列删除一个元素后会得到一个剩余序列,问这k个序列中是否存在和相等的剩余序列,若存在,输出这两个剩余序列是由哪个序列删除哪个元素得到的。注:这两个剩余序列必须来自不同的序列。
分析:题目的核心是求和,这个在读入数据时顺带求出来就行,然后一个循环就可以得到一个序列的所有剩余序列,那么问题不就只剩下判断这个剩余和是否出现过了吗。可以暴力——超时到死。要知道,关于判重,stl提供了两个非常好用的数据结构——set和map,用哪个呢,显然是后者,因为不仅仅涉及剩余和的判重,还要维护它是第几个序列删除第几个元素得到的,所以剩余和为key,序列号和删除元素的下标构成的结构体为key值。
问题解决
#include <bits/stdc++.h> using namespace std; struct Node{ int id, sum; }; map <int, Node> mp; int a[200200]; int main(){ int k, n; cin >> k; bool flag = false; for(int i = 1; i <= k; i ++){ cin >> n; int sum = 0; for(int j = 1; j <= n; j ++){ cin >> a[j]; sum += a[j]; } int rest; if(flag) continue ; for(int j = 1; j <= n; j ++){ rest = sum - a[j]; if(mp[rest]. id != i && mp[rest]. id != 0){ cout << "YES" << endl; cout << mp[rest]. id << ' ' << mp[rest]. sum << endl; cout << i << ' ' << j << endl; flag = true; break; } else{ mp[rest] = {i, j}; } } } if(! flag) cout << "NO" << endl; return 0; }