Divide by three, multiply by two

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
using namespace 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;
}

 方案二:

用cmp自定义排序规则

#include<iostream>  
#include<string.h>  
#include<algorithm>  
#include<cmath>  
#include<map>  
#include<string>  
#include<stdio.h>  
#include<vector>  
#include<stack>
#include<set>
using namespace std;
#define INIT ios::sync_with_stdio(false)
#define LL long long int
bool cmp(LL a, LL b) {
    int cnta, cntb;
    cnta = cntb = 0;
    while (a % 3 == 0) {
        a /= 3;
        cnta++;
    }
    while (b % 3 == 0) {
        b /= 3;
        cntb++;
    }
    if (cnta == cntb)
        return a < b;
        return cnta > cntb;
}

int main() {
    int n;
    LL num[1005];
    while (cin >> n) {
        for (int i = 0;i < n;i++) {
            cin >> num[i];
        }
        sort(num, num + n, cmp);
        for (int i = 0;i < n;i++) {
            cout << num[i] << (i == n - 1 ? "\n" : " ");
        }
    }
    return 0;
}

 


posted @ 2018-06-24 13:15  Termin  阅读(351)  评论(0编辑  收藏  举报