hdu 1270 小希的数表

题目

思路:

设所求的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了也算没有白忙。

原文地址:https://www.cnblogs.com/qie-wei/p/10160267.html