小希的数表题解

代码:

  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 }

原文地址:https://www.cnblogs.com/chenhongarticles/p/9304523.html

时间: 2024-10-08 12:54:34

小希的数表题解的相关文章

1036: 小希的数表

1036: 小希的数表 时间限制: 1 Sec  内存限制: 128 MB提交: 417  解决: 283[提交][状态][讨论版] 题目描述 Gardon 昨天给小希布置了一道作业,即根据一张由不超过 5000 的 N(3<=N<=100)个正整数组成的数表两两相加得到 N*(N-1)/2 个和,然后再将它们排序.例如,如果数表里含有四个数 1,3,4,9,那么正确答案是 4,5,7,10,12,13.小希做完作业以后出去玩了一阵,可是下午回家时发现原来的那张数表不见了,好在她做出的答案还在

Problem1270 小希的数表

小希的数表 http://acm.hdu.edu.cn/showproblem.php?pid=1270 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1720    Accepted Submission(s): 548 Problem Description Gardon昨天给小希布置了一道作业,即根据一张由不超过5000的N(3<

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

题意:... 析:我们可以知道,a1+a2=b1,那么我们可以枚举a1,那么a2就有了,并且a1+a3=b2,所以a3就有了,我们再从把里面的剩下的数两两相加,并从b数组中去掉, 那么剩下的最小的就是a4,然后依次可以求出a5,a6....由于a最大才是5000,并且保证有唯一解,那么找到一个就直接退出. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #incl

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

#include<iostream> 02.#include<algorithm> 03.using namespace std; 04. 05.bool cmp(int a,int b){ 06. return a>b; 07.} 08. 09.int p[9000010],n,k; 10.int a[3005]; 11. 12.int main(){ 13. while(cin>>n>>k){ 14. for( int i = 0 ; i <

小希的数表1

#include<stdio.h> #include<string.h> #include<algorithm> #define N 100010 using namespace std; int a[N]; int b[N]; int c[N]; int main() { int i,j,k,t; int n,m; while(scanf("%d",&n),n) { m=n*(n-1)/2; for(i=0;i<m;i++) scan

【每日题解 #12】P3312 [SDOI2014]数表

啊啊啊我昨天怎么没写题解wwww 补昨日题解... 题目链接 : https://www.luogu.org/problemnew/show/P3312 也是莫反 我要把fft留到今天写 [和zyn小可爱约好了 明天不填完坑就请她cafeking哦 表面题意:很明显了... 有一张N*m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和. 给定a,计算数表中不大于a的数之和. 第一步 : 每个格子里的那个东西是什么? 整

HDU--1272 小希的迷宫

上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路).小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路.比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8.

[BZOJ3529][Sdoi2014]数表

试题描述 有一张N×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. 输入 输入包含多组数据.输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据. 输出 对每组数据,输出一行一个整数,表示答案模2^31的值. 输入示例 2 4 4 3 10 10 5 输出示例 20 148 数据规模及约定 1 < =

sgu100~199题解

老东西了..发上来吧.. Sgu题解系列  南开中学邹事成 100:A+B略 101:Domino 给n块多米诺骨牌,每张骨牌两端各有从1到6的一个数字,现在要把这些骨牌排成一列,使相邻的两块骨牌相对的面所写的数字一样. 可以把每一块多米诺骨牌想象成一条边,把面上写的数字抽象成点,比如一块骨牌正面写的1反面写的2就想象成连了一条从1到2的边,那么这就是求一条有重边的欧拉回路了,dfs一下即可. 102:Coprimes给定n求从1到n中与n互质的数的个数. 可以把n质因数分解后直接代入欧拉函数.