先贴代码
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
int sum[N*(N-1)/2];
int vis[100010];
int a[N];
int n;
bool solve(int a1){
for(int i = 1;i<=n*(n-1)/2;i++){
vis[sum[i]]++;
}
a[1] = a1;;
a[2] = sum[1] - a1;
vis[sum[1]]--;
int cnt = 2,p = vis[sum[1]]>0?1:2;
while(cnt<n){
a[++cnt] = sum[p] - a[1];
for(int i = 1;i<cnt;i++){
if(vis[a[cnt] + a[i]]){
vis[a[cnt] + a[i]]--;
}else{
for(int j = 1;j<=n;j++){
vis[sum[j]] = 0;
}
return false;
}
}
while(vis[sum[p]]<=0)p++;
}
for(int i = 1;i<=n*(n-1)/2;i++){
vis[sum[i]] = 0;
}
return true;
}
int main(){
while(cin>>n){
for(int i = 1;i<=n*(n-1)/2;i++){
cin>>sum[i];
}
bool f = false;
sort(sum+1,sum+1+n*(n-1)/2);
for(int a1 = 0;a1<=sum[1];a1++){
if(solve(a1)){
f = true;
break;
}
}
if(!f){
cout<<"Impossible"<<'\n';
return 0;
}
for(int i = 1;i<=n;i++){
cout<<a[i]<<' ';
}
cout<<'\n';
}
}
经过输入输出调试样例发现在输入的时候RE炸出去了 注释掉以下代码样例会输出Imposible
vis[sum[i]]--;
我寻思着把前面for循环改成从二开始,这样正好等价 结果还是RE炸出去了
思路取自的是第一篇题解,但是把他的set改写为了一个vis数组桶计数,数组应该是开够了(包括vis的100010),但是样例只有3根本过不去