codeforces 988c

题意:输入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;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/80545402