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, outputone 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 16633 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 886Impossible
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; }
相关文章推荐
- hdu 1870 栈
- hdoj 1870 愚人节的礼物 【简单的栈应用】
- hdoj 1870 愚人节的礼物
- HDOJ 1870 愚人节的礼物(水题)(栈练习)
- HDU 1870 愚人节的礼物
- ★ZZULIoj--1870(枚举好题)
- zcmu 1615: 找区间
- ZCMU—1611
- ZCMU—1346
- ZCMU—1780
- ZCMU-校赛D-1779
- ZCMU—1198
- ZCMU-1149-分硬币
- ZCMU—1160
- ZCMU—1660
- ZCMU-1205-正序数
- ZCMU-1379-The Black Hole of Numbers
- ZCMU—1793
- ZCMU-1178-完美的数
- ZCMU-1812-K好数