您的位置:首页 > 其它

ZCMU—1870

2017-02-16 18:27 218 查看

Problem B: Problem B: Pairsumonious Numbers

Time Limit: 1 Sec  Memory Limit: 128 MB

[Submit][Status][Web
Board]

Description



Problem B: Pairsumonious Numbers

For 10 > N > 2 numbers we form N*(N-1)/2 sums by adding every pair of the numbers. Your task is to find the N numbers given the sums. Each line of input contains N followed by N*(N-1)/2 integer numbers separated by a space. For each line of input, output
one line containing N integers in non-descending order such that the input numbers are pairwise sums of the N numbers. If there is more than one solution, any one will do; if there is no solution, print "Impossible".

Input

Output

Sample Input

3 1269 1160 1663

3 1 1 1

5 226 223 225 224 227 229 228 226 225 227

5 216 210 204 212 220 214 222 208 216 210

5 -1 0 -1 -2 1 0 -1 1 0 -1

5 79950 79936 79942 79962 79954 79972 79960 79968 79924 79932

Sample Output

383 777 886

Impossible

111 112 113 114 115

101 103 107 109 113

-1 -1 0 0 1

39953 39971 39979 39983 39989

【分析】

题意很简单,给出n*(n-1)/2个和,求原本n个数。
首先可以确定在升序的sum中
sum[1]=a[1]+a[2]
sum[2]=a[1]+a[3];
但是不能确定sum[3]=a[2]+a[3];所以枚举模拟a[2]+a[3]=sum[i]
对sum[1],sum[2],sum[i]可以求出a[1],a[2],a[3],然后就可以顺推出剩下的数,只要成功推出一组数就可以输出答案并且结束当前组数据...
a[1]=(sum[1]+sum[2]-sum[i])/2
a[2]=sum[1]-a[1];
a[3]=sum[2]-a[1];
模拟一下算出公式就可以了
【代码】
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
int a[500];
int ans[500];
int n;
int vis[500];

void write()
{
for (int i=1;i<n;i++) printf("%d ",ans[i]);
printf("%d\n",ans
);
}

int main()
{
while (~scanf("%d",&n))
{
int len=n*(n-1)/2;
for (int i=0;i<len;i++) scanf("%d",&a[i]);
sort(a,a+len);
for (int i=2;i<len;i++)
if ((a[0]+a[1]-a[i])%2==0)
{
ans[1]=(a[0]+a[1]-a[i])/2;
ans[2]=a[0]-ans[1];
ans[3]=a[1]-ans[1];
memset(vis,0,sizeof(vis));
vis[1]=vis[0]=vis[i]=1;
int now=1;
int flag2=0;
for (int j=4;j<=n;j++)
{
while (vis[now]) now++;
ans[j]=a[now]-ans[1];
for (int k=1;k<j;k++)
{
int flag1=0;
for (int p=now;p<len;p++)
if (!vis[p]&&ans[k]+ans[j]==a[p])
{
vis[p]=1;
flag1=1;
break;
}
if (flag1==0)
{
flag2=1;
break;
}
}
if (flag2) break;
}
if (!flag2)
{
write();
goto out;
}
}
printf("Impossible\n");
out:;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: