CodeForces - 977D:序列(DFS)

博客介绍了CodeForces的一道题目,涉及数字序列和泰泰学长的操作。题目要求根据给定的乱序数字,通过除以3或乘以2的操作,重建可能的原始序列。解题方法使用了深度优先搜索(DFS),并利用Map优化算法,确保答案存在。
摘要由CSDN通过智能技术生成

原题链接
泰泰学长喜欢玩数字(不知道什么奇怪的癖好)。他在黑板上写下一个数字 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

题目描述

将给出的一串数字经过题目描述的操作之后,得到新的顺序,并输出

思路:很明显是dfs,由于不知道第一个开头数字是多少,所以需要试探每个数字作为开头,如果搜索完成,那么这个序列就符合条件,代码里面使用了map代替我们通常记录数字是否出现的book,这也是一个巧妙的地方,能够优化算法,应为你需要在这些数字中去寻找符合条件的是够存在,map就可以直接找到

代码如下

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <map>

using namespace std;

typedef long long ll;
ll a[105],vis[105]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值