zoukankan      html  css  js  c++  java
  • 除以三,乘以二

    泰泰学长喜欢玩数字(不知道什么奇怪的癖好)。他在黑板上写下一个数字 x ,然后进行 n-1 次以下两种操作:

    • x 除以3 (必须能整除才能进行,即 x mod 3=0)
    • x 乘以2

    每次操作完成后,泰泰学长在黑板上写上这个操作后的新数字,并让这个新数字作为新的 x 继续下一次操作。最后黑板上有 n 个数字。

    由于泰泰学长是随机在黑板上的位置写数字的,所以他最后忘记了顺序。现在泰泰学长只知道所有的数字,你能帮助泰泰学长找出一种可能的序列吗?

    保证答案一定存在。

    Input

    第一行是数字总数 n (2 ≤ n ≤ 100)。第二行包含 n 个数字a1,a2,…,an (1 ≤ ai ≤3×10^18),注意是不按顺序的。

    Output

    输出 n 个数字,按照泰泰学长写数字的顺序排列。

    保证答案一定存在。

    Examples

    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 

    Note

    第一个样例中的可能顺序为:[9, 3, 6, 12, 4, 8]。此时开始的 x=9

    AC代码1:

    #include<cstdio>
    #include <map> 
    #include<iostream>
    #include<string>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;}
    typedef long long ll;
    const int maxn=1000;
    ll a[maxn];
    ll b[maxn];
    map<ll,int>mp;
    int main()
    {
        ll n;
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>a[i];
            mp[a[i]]=1;
        }
        ll ans;
        int j;
        for(int i=0;i<n;i++){
            b[0]=a[i];
            ans=a[i];
            for(j=1;j<n;j++){
                if(mp[ans/3]==1&&ans%3==0){
                    b[j]=ans/3;
                    mp[ans/3]=0;
                    ans/=3;
                }
                else if(mp[ans*2]==1){
                    b[j]=ans*2;
                    mp[ans*2]=0;
                    ans*=2;
                }
                else{
                    break;
                }
            }
            if(j==n){
                for(int k=0;k<n;k++){
                    printf("%lld ",b[k]);
                }
            }
            else{
                for(int k=0;k<n;k++){
                    mp[a[k]]=1;
                } 
            }        
        }
    }

    AC代码2(dfs):

    #include<cstdio>
    #include <map>
    #include<iostream>
    #include<string>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;}
    typedef long long ll;
    const int maxn=1000;
    map<ll,int>mp;
    ll a[maxn];
    ll b[maxn];
    int flag=0;
    int n;
    void dfs(ll x,int p){
        if(flag){
            return ;
        }
        if(p==n){
            flag=1;
            return ;
        }
        if(x%3==0&&mp[x/3]==1){
            b[p]=x/3;
            mp[x/3]=0;
            dfs(x/3,p+1);
            mp[x/3]=1;
        }
        else if(mp[x*2]==1){
            b[p]=x*2;
            mp[x*2]=0;
            dfs(x*2,p+1);
            mp[x*2]=1;
        }
    }
    int main(){
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>a[i];
            mp[a[i]]=1;
        }
        for(int i=0;i<n;i++){
            b[0]=a[i];
            dfs(a[i],1);
            if(flag){
                for(int j=0;j<n;j++){
                    printf("%lld ",b[j]);
                }
                break;
            }
        }
        return 0;
    }
  • 相关阅读:
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
    UVA 11100 The Trip, 2007 (贪心)
    JXNU暑期选拔赛
    计蒜客---N的-2进制表示
    计蒜客---线段的总长
    计蒜客---最大质因数
    JustOj 2009: P1016 (dp)
  • 原文地址:https://www.cnblogs.com/lipu123/p/12238276.html
Copyright © 2011-2022 走看看