Difference between r1.1 and the current
@@ -98,4 +98,4 @@
}}}
* 예제 케이스에 두가지경우 빼곤 다 되네요. 두 경우는 무한루프 =ㅅ= -[김태진]
* 예제 케이스에 두가지경우 빼곤 다 되네요. 두 경우는 무한루프 =ㅅ= -[김태진]
Pairsumonious_Numbers ¶
#include <iostream> #include <stdio.h> #include <math.h> using namespace std; int arr[50],a[10],n; int comp(int a,int b) { return a<b; } int findThird(int Aindex,int i3) { int x,i,j,flag=0,k; if(Aindex==n)return 1; for(i=2;i<n*(n-1)/2-1;i++){ for(j=i+1;j<n*(n-1)/2;j++){ if(abs(arr[i]-arr[j])==abs(a[Aindex-2]-a[Aindex-1])){ x=abs(arr[i]-a[Aindex-2]); flag=1; for(k=0;k<Aindex;k++){ if(a[k]==x)flag=0; } if(flag==1)break; } if(flag==1)break; } } a[Aindex]=x; findThird(Aindex+1,1); return 0; } int findFirstThree(int i1,int i2,int i3) { int i,tmp; a[0]=(i1+i2-i3)/2; a[1]=(i2+i3-i1)/2; a[2]=(i1+i3-i2)/2; if(a[1]>a[2]){ tmp=a[1]; a[1]=a[2]; a[2]=tmp; } findThird(3,1); return 0; } int isValid() { int i,j,k=0; int checkArr[50]; for(i=0;i<n-1;i++){ for(j=i+1;j<n;j++){ checkArr[k++]=a[i]+a[j]; } } sort(checkArr,checkArr+n*(n-1)/2,comp); sort(arr,arr+n*(n-1)/2,comp); for(i=0;i<n*(n-1)/2;i++){ if(checkArr[i]!=arr[i]){ return -1; } } return 1; } int main() { int i,j,k; while(1){ if(feof(stdin))break; scanf("%d",&n); for(i=0;i<n*(n-1)/2;i++){ scanf("%d",&arr[i]); } sort(arr,arr+n*(n-1)/2,comp); for(i=2;i<n;i++){ findFirstThree(arr[0], arr[1], arr[i]); if(isValid()==1){ sort(a,a+n,comp); for(j=0;j<n;j++){ printf("%d ",a[j]); } return 0; } } } printf("Impossible"); return 0; }