题目链接
思路
先升序排序b,显然有两种情况可以找到序列a。
--- 前n项之和等于第n+1项,也就是要扔掉第n+2项
---(前n+1项之和)-(某一项)==第n+2项,也就是要扔掉那某一项
关于第二种情况,用rtmp记录(前n+1项之和-第n+2项)的值
显然要删的那个项的值就是rtmp
AC代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;
const int N=2e5+7;
int b[N];
typedef long long ll;
void solve(){
int n;
cin>>n;
for(int i=1;i<=n+2;i++) cin>>b[i];
sort(b+1,b+n+2+1);
ll sum=0;
for(int i=1;i<=n;i++) sum+=b[i];
ll ltmp=b[n+1]-sum;
ll rtmp=b[n+1]+sum-b[n+2];
if(ltmp==0){
for(int i=1;i<=n;i++)cout<<b[i]<<' ';
cout<<'\n';return;
}
ll index=-1;
for(int i=1;i<=n+1;i++){
if(b[i]==rtmp){
index=i;break;
}
}
if(index==-1){
cout<<-1<<'\n';return;
}
for(int i=1;i<=n+1;i++){
if(i==index) continue;
cout<<b[i]<<' ';
}
cout<<'\n';return;
}
int main(){
int t;cin>>t;
while(t--)solve();
return 0;
}