思路:
设所求的n个数按从小到大排列为a1,a2....an。
a1+a2一定是n*(n-1)/2个数的序列中最小的,a1+a3一定是次小的,通过枚举a2+a3的值解出符合条件的a1,a2,a3,
把他们两两相加的结果从n*(n-1)/2个数中排除。
然后n*(n-1)/2个数中剩下的第一个没有被排除的数一定是a1+a4的值,这样可以求的a4,再从n*(n-1)/2个数中除去a1+a4,a2+a4,a3+a4。
然后n*(n-1)/2个数中剩下的第一个没有被排除的数一定是a1+a5的值,这样可以求的a5……
如此重复,直到求的an的值,并除去a1+an,a2+an,....an-1+an,此时如果n*(n-1)/2个数已经全部除去,那么就得到了答案,否则,说明枚举的a2+a3的值仍不合要求,继续枚举下一个a2+a3的值。
#include<stdio.h>
#include<string.h>
int n,b[4951],a[4951],has[10000],n2;
int i,flag,k,j,z;
int main()
{
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(has,0,sizeof(has));
for( j=1;j<=n2;j++)
has[a[j]]++;
k=0;
for(j=1;j<=n2;j++)
{
flag=0;
if(has[a[j]]<=0) continue;
b[++k]=a[j]-i;
for(z=1;z<k;z++)
{
if(has[b[z]+b[k]]<=0) {
k--;
flag=1;
break;
}
}
if(!flag) {
for(z=1;z<k;z++)
has[b[z]+b[k]]--;
}
}
if(k==n-1)
{
printf("%d",i);
for(j=1;j<=k;j++)
printf(" %d",b[j]);
printf("
");
break;
}
}
}
return 0;
}
写这道题用了我大半天的时间,其中主要的心路历程便是:开始,各种看博客把别人的代码弄懂,然后就是各种查错。因为我提交的代码老是有问题,不是说我答案错误,就是运行错误。。。
搞了半天终于AC了也算没有白忙。