喜洋洋 c++

来源:互联网 发布:人工智能电影在线观看 编辑:程序博客网 时间:2024/04/28 08:16

有n个数 两两相加可的n*(n-1)/2个数 然后把这些相加后的数字排序 要求用相加并排好序列的数求原始数

例如

1 4  6 7

相加排序后 5 7 8 10 11 13

输入5 7 8 10 11 13

输出1 4  6 7

 

下面程序输入格式

输入:6                                   //第一行 n表示要输入n个数

         5 7 8 10 11 13              // 第二行输入 这n个数

输出:1 4  6 7

#include<stdio.h>

#include<math.h>

void main()

{

       int a[5000];//原数组

       int b[50];//解集

       bool ok[5000]={false};//判断原数据相应位置是出现过

       int i,j,k,l,n,w;

       i=0;

       scanf("%d",&n);

       while(scanf("%d",&a[i++])&&i<n);

 

       for(w=1;w<=a[0]/2;w++)//枚举第一个解

       {

              b[0]=w;//存放第一个解

              b[1]=a[0]-w;//第二个解

        for(i=2;i<(1+sqrt(1+8*n))/2;i++)

              {

                  k=i-1;

                  while(ok[k]){k++;}

                  b[i]=a[k]-b[0];

                     ok[k]=true;

                  for(j=0;j<i;j++)

                         for(l=i;l<n;l++)

                            {

                                if((a[l]==b[j]+b[i])&&!ok[l])

                                   {

                                       ok[l]=true;

                                       while(a[l]==b[j]+b[i]){l++;}

                                   }

                            }

              }

              for(j=2;j<n;j++)

                     if(!ok[j])break;

              if(j==n)

              {

                     for(i=0;i<(1+sqrt(1+8*n))/2;i++)

                  printf("%d ",b[i]);

                     break;

              }

              else

              {

                     for(j=0;j<n;j++)

                            ok[j]=false;

              }

       }

 

}

 

原创粉丝点击