1036: 小希的数表

Posted 知我者,足以

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于1036: 小希的数表的主要内容,如果未能解决你的问题,请参考以下文章

Problem1270 小希的数表

HDU 1270 小希的数表 (暴力枚举+数学)

小希的数表1

小希的数表2(用的for循环)

HDU 1272 小希的迷宫

小希的迷宫