hdu 1270 小希的数表

来源:互联网 发布:linux中sed命令详解 编辑:程序博客网 时间:2024/06/05 15:58

题目

思路:

设所求的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("\n");                break;            }        }    }    return 0;}


写这道题用了我大半天的时间,其中主要的心路历程便是:开始,各种看博客把别人的代码弄懂,然后就是各种查错。因为我提交的代码老是有问题,不是说我答案错误,就是运行错误。。。

搞了半天终于AC了也算没有白忙。

原创粉丝点击