hdu 1270 小希的数表

来源:互联网 发布:excel数据分析报告范文 编辑:程序博客网 时间:2024/05/16 13:41
/*枚举答案的第一个数。可知 枚举的第一个数若是正确的。那么用题目所给的输入数组 一个一个的减去第一个数得到一个数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;            }        }    }}