1036: 小希的数表

1036: 小希的数表

时间限制: 1 Sec  内存限制: 128 MB
提交: 417  解决: 283
[提交][状态][讨论版]

题目描述

Gardon 昨天给小希布置了一道作业,即根据一张由不超过 5000 的 N(3<=N<=100)个正整数组成的数表两两相加得到 N*(N-1)/2 个和,然后再将它们排序。例如,如果数表里含有四个数 1,3,4,9,那么正确答案是 4,5,7,10,12,13。小希做完作业以后出去玩了一阵,可是下午回家时发现原来的那张数表不见了,好在她做出的答案还在,你能帮助她根据她的答案计算出原来的数表么?

输入

包含多组数据,每组数据以一个 N 开头,接下来的一行有按照大小顺序排列的 N*(N-1)/2 个数,是小希完成的答案。文件最后以一个 0 结束。
假设输入保证解的存在性和唯一性。

输出

 对于每组数据,输出原来的数表。它们也应当是按照顺序排列的。

样例输入

4
4 5 7 10 12 13
4
5 6 7 8 9 10
0

样例输出

1 3 4 9
2 3 4 6




#include<iostream>
#include<vector>
using namespace std;
int solve(int x,int s2,int s1){
if((x+s2-s1)%2==0){
return (x+s2-s1)/2;
}
else
return 0;
}
int main(){
for(;;){
int n;
cin>>n;
if(n==0)break;
else{
int a[n];
vector<int> s(n*(n-1)/2);
for(int i=0;i<n*(n-1)/2;i++){
cin>>s[i];
}
for(int i=2;i<n*(n-1)/2;i++){
if(solve(s[i],s[1],s[0])!=0){
a[2]=solve(s[i],s[1],s[0]);
s[i]=0;
break;
}
}
a[1]=s[0]-s[1]+a[2];
a[0]=s[0]-a[1];
s[0]=0;s[1]=0;
int j=2;
for(int i=3;i<n;i++){
for(int j=2;j<n*(n-1)/2;j++){
if(s[j]!=0){
a[i]=s[j]-a[0];}
for(int k=0;k<i;k++){
for(int q=0;q<n*(n-1)/2;q++){
if(s[q]==a[i]+a[k]){
s[q]=0;
}
}
}
}
}
for(int i=0;i<n;i++){
if(i==0)
cout<<a[i];
else
cout<<" "<<a[i];
}
cout<<endl;
}
}
return 0;
}

posted @ 2016-09-06 23:15  知我者,足以  阅读(1301)  评论(0编辑  收藏  举报