Divide by three, multiply by two
Posted coder-tcm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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?‘ ‘:‘ ‘); return 0; }
以上是关于Divide by three, multiply by two的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #479 (Div. 3) D. Divide by three, multiply by two
Codeforces977D ---Divide by three, multiply by two 深搜+map存出现的数
Codeforces Round #479 (Div. 3) D. Divide by three, multiply by two
Codeforces Round #653 (Div. 3) B. Multiply by 2, divide by 6 (数学)