hdu 1270 小希的数表

思路:一定有sum[1]=num[1]+num[2],sum[2]=num[1]+num[3];

但是sum[3]不知道是由num[1]+num[4]还是num[2]+num[3],这就需要枚举一下了。然后算出num[1],num[2],num[3]的值。

并从sum中剔除他们,这是最小的一个一定是num[1]+num[4],再把num[4]+num[2-(4-1)]的和剔除,这时最小的一定是num[1]+num[5]……

以此类推就可以了……

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1270

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<string>
using namespace std;
int
num[105],sum[5100],mark[5100];
int
main()
{

    int
n,i,j,m,c,k;
    while
(cin>>n&&n)
    {

        m=(n-1)*n/2;
        for
(i=1;i<=m;i++)
            cin>>sum[i];
        sort(sum+1,sum+m+1);
        for
(i=3;i<=m;i++)
        {

            num[2]=(sum[1]-sum[2]+sum[i])/2;
            num[1]=sum[1]-num[2];
            num[3]=sum[2]-num[1];
            if
(num[2]+num[3]!=sum[i]) continue;
            memset(mark,0,sizeof(mark));
            mark[i]=1;k=3;
            bool
flag=1;
            for
(j=4;j<=n&&flag;j++)
            {

                while
(mark[k]==1) k++;
                num[j]=sum[k]-num[1];
                mark[k]=1;
                for
(int l=2;l<j&&flag;l++)
                {

                    flag=0;
                    for
(int x=k+1;x<=m;x++)
                    {

                        if
(mark[x]==0&&num[j]+num[l]==sum[x])
                        {

                            mark[x]=1;
                            flag=1;
                            break
;
                        }
                    }
                }
            }

            if
(flag) break;
        }

        for
(i=1;i<n;i++)
            cout<<num[i]<<' ';
        cout<<num[n]<<endl;       
    }

    return
0;
}

原文地址:https://www.cnblogs.com/xin-hua/p/3193989.html