/*
枚举答案的第一个数。
可知 枚举的第一个数若是正确的。
那么用题目所给的输入数组 一个一个的减去第一个数得到一个数bi。用bi与前面的b1到bi-1分别相加。
如果都是hash记录的数 则bi就是要求的一个数。 否则就不是。
这样一直下去就可以求出结果。。
最坑的就是题目中输入时n*(n-1)/2个和 这些和中有可能是重复的
所以hash 要 ++ -- 不能是 0 1;
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,n2,a[4951],hash[10000],b[4951],i,j,k,z;
int main()
{
//freopen("test.txt","r",stdin);
while(scanf("%d",&n)&&n)
{
n2=n*(n-1)/2;
for(i=1;i<=n2;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<(a[1]+1)/2;i++)//枚举第一个数
{
memset(hash,0,sizeof(hash));
for(j=1;j<=n2;j++)
hash[a[j]]++;
k=0;
for(j=1;j<=n2;j++)
{
if(hash[a[j]]<=0)
continue;
b[++k]=a[j]-i;
for(z=1;z<k;z++)
{
if(hash[b[z]+b[k]]<=0)
{
k--;
goto B;
}
}
for(z=1;z<k;z++)
hash[b[z]+b[k]]--;
B:;
}
if(k==n-1)
{
printf("%d",i);
for(j=1;j<=k;j++)
printf(" %d",b[j]);
printf("\n");
break;
}
}
}
}
hdu 1270 小希的数表
最新推荐文章于 2023-07-17 09:07:08 发布