传送门、
题意:
给一个长度为n + 2的数组,找出里边n个数的和
=剩下的两个数其中一个
即可
思路:
先sort排序,然后求出前n + 1个数的和;
然后遍历n次,减去每一次遍历的b数组值,即为n个数的和;
去和第n + 2个数比较,然后特判一下,前n个数的和时是不是可能和第n + 1个数或第n + 2个数相等。
代码:
#include <iostream>
#include <cstring>
#include <cmath>
#include <string>
#include <algorithm>
#include <queue>
#include <utility>
#include <map>
#include <stack>
#define mes memset
#define mec memcpy
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
const int N = 400010;
const int null = 0x3f3f3f3f;
int T;
int n;
ll b[N];
int main()
{
cin >> T;
while(T --)
{
cin >> n;
for(int i = 0;i < n + 2;i ++) cin >> b[i];
sort(b,b + n + 2);
ll sum = 0;
for(int i = 0;i < n + 1;i ++) sum += b[i];
int id = -1;
for(int i = 0;i < n;i ++)
{
if((sum - b[i]) == b[n + 1])
{
id = i;
break;
}
}
if(id == -1)
{
sum -= b[n];
if(sum == b[n + 1]) id = n;
else if(sum == b[n]) id = n;
}
if(id == -1)
{
cout << id << endl;
}
else
{
for(int i = 0;i < n + 1;i ++)
{
if(i != id) cout << b[i] << " ";
}
cout << endl;
}
mes(b,0,sizeof b);
}
return 0;
}