Divide by three, multiply by two
阿新 • • 發佈:2018-06-24
元素 bre scanf 一個數 \n input out 排列 long long
Polycarp喜歡玩數字。 他取一些整數x,寫在黑板上,然後執行兩種運算:
- 將數字x除以3(x必須可以被3整除);
- 將數字x乘以2。
Input
輸入的第一行包含整數n(2≤n≤100) - 序列中元素的數量。 輸入的第二行包含n個整數a1,a2,...,an(1≤ai≤3⋅1018)
Output
輸出n個整數 - 重新排列後的序列,可以是原序列。 保證答案的存在。Sample Input
Input
6 4 8 6 3 12 9
Output
9 3 6 12 4 8
Input
4 42 28 84 126
Output
126 42 84 28
Input
2 1000000000000000000 3000000000000000000
Output
3000000000000000000 1000000000000000000
用DFS枚舉可能的情況(可能性逐漸增高),直至構造出題目要求的序列
#include <iostream> #include <cstdio> #include <map> #define LL long long int usingnamespace std; map<LL,int>mp; LL a[111]; LL ans[111]; int cur,n; int DFS(LL b) { if(cur==n-1) { ans[cur++]=b; return 1; } if(mp[b*2]) { ans[cur++]=b; if(DFS(b*2)) return 1; else cur--; } if( b%3==0 && mp[b/3]) { ans[cur++]=b; if(DFS(b/3)) return 1; else return 0; } return 0; } int main() { int i; cin>>n; for(i=0;i<n;i++) { scanf("%lld",&a[i]); mp[a[i]]=1; } for(i=0;i<n;i++) { cur=0; if(DFS(a[i]) ) break; } for(i=0;i<n;i++) printf("%lld%c",ans[i],i==n-1?‘\n‘:‘ ‘); return 0; }
Divide by three, multiply by two