个人觉得这场就是个DFS专场。。。
题解:
1、给出长度为n的序列,序列值的范围1到3e18,让你把序列顺序改变成合法序列(前一个数是后一个数的三倍 或者 后一个数是前一个数的两倍)注意都是整数倍
2、据说排序后效率更高,但我一看到题目的序列长度范围我就没考虑,直接DFS搜所有答案
3、详细见注释
#include <bits/stdc++.h>
using namespace std;
int n;
const int maxn = 100+10;
unsigned long long a[maxn];
bool visited[maxn];
vector<unsigned long long> di;
void dfs(int count){ //参数表示当前序列的合法长度
if(count == n){ //长度到n时才是答案
for(vector<unsigned long long>::iterator i=di.begin();i!=di.end();i++)
cout << *i << " ";
cout << endl;
exit(0); //只需要任意一个答案即可
}
unsigned long long t = *(di.end()-1);
for(int i=1;i<=n;i++){
if(visited[i] == true) //标记过的不进行计算,即在一条序列中对于同一个数据不重复运算
continue;
if(a[i]*3 == t || t*2 == a[i]){
di.push_back(a[i]);
visited[i] = true; //对可以使用的进行标记
dfs(count+1);
visited[i] = false; //取消使用标记,以便下一条序列使用
di.pop_back();
}
}
}
int main(){
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=n;i++){ //以序列每个元素作为起点
visited[i] = true;
di.push_back(a[i]);
dfs(1);
visited[i] = false;
di.pop_back();
}
return 0;
}