小希的数表题解

Posted chenhongarticles

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小希的数表题解相关的知识,希望对你有一定的参考价值。

技术分享图片

代码:

  1 #include<iostream>
  2 #include<cstring>
  3 #include<algorithm>
  4 #define N 5005
  5 using namespace std;
  6 
  7 int a[N*(N-1)/2];
  8 int b[N*(N-1)/2];
  9 //int c[N*(N-1)/2];
 10 //bool flag[N*(N-1)/2];
 11 int x[N+5];
 12 
 13 int Add(int i,int j)
 14 {
 15     return x[i]+x[j];
 16 }
 17 
 18 int main()
 19 {
 20     int n;
 21     while(cin>>n)
 22     {
 23         if(n==0)
 24         {
 25             break;
 26         }
 27         memset(x,0,sizeof(x));
 28         memset(a,0,sizeof(a));
 29         for(int i=1; i<=n*(n-1)/2; i++)
 30         {
 31             cin>>a[i];
 32             b[i]=a[i];
 33         }
 34         //sort(a+1,a+1+(n*(n-1)/2));
 35         for(int l=3; l<=n; l++)
 36         {
 37             for(int i=1; i<=n*(n-1)/2; i++)
 38             {
 39                 a[i]=b[i];
 40             }
 41             x[3]=(a[2]-a[1]+a[l])/2;
 42             x[2]=a[l]-x[3];
 43             x[1]=a[1]-x[2];
 44             if(n==3)
 45             {
 46                 cout<<x[1]<<" "<<x[2]<<" "<<x[3]<<endl;
 47                 continue;
 48             }
 49             //x[4]=a[4]-x[1];
 50 
 51             for(int i=2; i<=3; i++)
 52             {
 53                 for(int j=1; j<i; j++)
 54                 {
 55                     for(int k=1; k<=n*(n-1)/2; k++)
 56                     {
 57                         if(a[k]==Add(j,i))
 58                         {
 59                             a[k]=-1;
 60                             break;
 61                         }
 62                     }
 63                     //flag[Add(i,j)]=1;
 64                 }
 65 
 66             }
 67 
 68             for(int i=4; i<=n; i++)
 69             {
 70                 for(int j=1; j<i; j++)
 71                 {
 72                     //flag[Add(i,j)]=1;
 73                     if(j==1)
 74                     {
 75                         int k=1;
 76                         for(; k<=n*(n-1)/2; k++)
 77                         {
 78 
 79                             if(a[k]!=-1)
 80                             {
 81                                 //temp=a[k];
 82                                 break;
 83                             }
 84 
 85                         }
 86                         x[i]=a[k]-x[1];
 87                         //cout<<x[i]<<endl;
 88                     }
 89                     for(int k=1; k<=n*(n-1)/2; k++)
 90                     {
 91                         if(a[k]==Add(j,i))
 92                         {
 93                             a[k]=-1;
 94                             break;
 95                         }
 96                     }
 97                     //flag[Add(x[j],x[i])]=0;
 98                 }
 99 
100             }
101             for(int i=1; i<=n*(n-1)/2; i++)
102             {
103                 a[i]=b[i];
104             }
105             bool can=1;
106             for(int i=2; i<=n; i++)
107             {
108                 for(int j=1; j<i; j++)
109                 {
110                     bool mark=0;
111                     for(int k=1; k<=n*(n-1)/2; k++)
112                     {
113                         if(a[k]==Add(j,i))
114                         {
115                             //cout<<b[k]<<endl;
116                             a[k]=-1;
117                             mark=1;
118                             break;
119                         }
120                     }
121                     if(mark==0)
122                     {
123                         can=0;
124                         //cout<<"111"<<endl;
125                         break;
126                     }
127                 }
128                 if(can==0)
129                 {
130                     //cout<<"222"<<endl;
131                     break;
132                 }
133 
134             }
135             if(can==1)
136             {
137                 for(int i=1; i<=n; i++)
138                 {
139                     if(i<n)
140                     {
141                         cout<<x[i]<<" ";
142                     }
143                     else
144                     {
145                         cout<<x[i]<<endl;
146                     }
147                 }
148                 break;
149             }
150         }
151 
152     }
153     return 0;
154 }

 

以上是关于小希的数表题解的主要内容,如果未能解决你的问题,请参考以下文章

Problem1270 小希的数表

HDU 1270 小希的数表 (暴力枚举+数学)

小希的数表1

小希的数表2(用的for循环)

HDU 1272 小希的迷宫

小希的迷宫