4211 序列重排(构造、思维题--双关键字排序)

2023-10-27

1. 问题描述:

给定一个长度为 n 的整数序列 a1,a2,…,an。请你对序列进行重新排序(也可以保持原序列),要求新序列满足每个元素(第 1 个除外)都恰好是前一个元素的两倍或前一个元素的三分之一。保证输入一定有解。

输入格式

第一行包含整数 n。第二行包含 n 个整数 a1,a2,…,an。

输出格式

一行 n 个整数,表示排序后的序列。输出任意合法方案即可。

数据范围

前三个测试点满足 2 ≤ n ≤ 10。
所有测试点满足 2 ≤ n ≤ 100,1 ≤ ai ≤ 3 × 10 ^ 18。

输入样例1:

6
4 8 6 3 12 9

输出样例1:

9 3 6 12 4 8 

输入样例2:

4
42 28 84 126

输出样例2:

126 42 84 28

输入样例3:

2
1000000000000000000 3000000000000000000

输出样例3:

3000000000000000000 1000000000000000000
来源:https://www.acwing.com/problem/content/description/4214/

2. 思路分析:

这道题目属于典型的思维题,一般思维题都需要挖掘一下题目存在什么性质,因为题目规定了有解所以我们只需要考虑有解的序列即可,由于涉及到2的倍数和3的倍数所以我们可以用xi表示第i个数因子2的数量,yi表示第i个数因子3的数量,对于一个合法的序列我们需要考虑一下需要满足什么样的性质,先考虑因子2,因为当前的数字要么是前一个数字的2倍要么是前一个数的1/3所以当前数字因子2的数量要么比前一个数的因子2的数量多1,要么相等,如果当前数字是前一个数字的1/3那么此时因子2的数量是相等的,因子3的数量前一个数比后一个数多1,所以一个解是合法序列需要满足的必要条件(一般是看一下解满足的必要条件然后判断是否可以证明出来是充分条件如果不是唯充分条件那么看必要条件是否是唯一的):

  • xi < x(i + 1) 或者 xi = x(i + 1) 并且yi > y(i + 1)

那么会不会存在有两个数的因子2的数量等于因子3的数量呢?也即xi = x(i + 1)并且yi = y(i + 1),可以证明是不存在这两个数字的,如果xi = xj,若i与j之间存在其他的数则xi = x(i + 1) = x(i + 2)... = xj,根据上面的合法序列满足的必要条件可以知道yi > y(i + 1) > y(i + 2) > ... yj,所以与yi = y(i + 1) = y(i + 2) = ... yj是矛盾的所以x与y是不可能同时相等的,所以满足上面必要条件的序列是唯一的,如果只是满足了必要条件那么可能不是一个合法序列但是满足这个必要条件的序列是唯一的所以这个合法序列也是唯一的,可以发现满足必要条件的序列类似于c++中pair的双关键字排序,所以我们可以按照因子2的数量升序排序,因子3的数量降序排序,最终得到的排序序列就是唯一的合法序列(一个解需要满足的条件是必要条件,能够推出解的是充分条件)。

3. 代码如下:

class Solution:
    # 计算x有多少个因子b
    def get(self, x: int, b: int):
        # 一直除就可以
        res = 0
        while x % b == 0:
            x //= b
            res += 1
        return res

    def process(self):
        n = int(input())
        a = list(map(int, input().split()))
        q = list()
        for x in a:
            q.append((self.get(x, 2), -self.get(x, 3), x))
        # 按照双关键字排序: 因子2的数量升序排列, 因子3的数量降序排序
        q.sort(key=lambda x: (x[0], x[1]))
        for i in range(n):
            print(q[i][2], end=" ")


if __name__ == '__main__':
    Solution().process()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

4211 序列重排(构造、思维题--双关键字排序) 的相关文章

  • 时空预测

    目录 线性时空预测 图时空预测 线性时空预测 这篇文章在时空预测领域 搭建了一个简单高效的线性模型 且使用了channel independence的方式进行建模 模型的整体结构如下图所示 是一个级联的结构 输入分为三个部分 tempora

随机推荐

  • pythonflaskmock数据_基于 Flask 的简易 Mock 平台

    Mock Server 基于Flask实现的一个简易Mock平台 使用标准json结构体编写Mock Api https github com yinquanwang MockServer Key Features 遵循Http协议 支持G
  • JavaScript(1)-JS变量、关键字、命名规范

    文章目录 前言 一 JS变量 关键字 命名规范 1 关键字 已经被JS内部使用了的 2 保留字 虽然暂时还未被使用 但将来可能会被JS内部使用 变量的命名规范 JS数据类型 JS运算符的使用 算术运算符 总结 前言 JavaScript是一
  • 【数据结构】多项式相加

    问题描述 编写一个程序用单链表存储多项式 并实现两个一元多项式A与B相加的函数 A B刚开始是无序的 A与B之和按降序排列 例如 多项式A 1 2X 0 2 5X 1 3 2X 3 2 5X 5 多项式B 1 2X 0 2 5X 1 3 2
  • 电话号码对应英文单词 (python)

    在电话号码输入数字 输出他所有的单词组合 解法 1 循环法 这里假设电话号码只有3位 那么可以使用3个for循环来进行输出 c ABC DEF GHI JKL MNO PQRS TUV WXYZ 分别代表着0 1 2 3 4 5 6 7 8
  • 如何在C++中删除文件

    include
  • 浅析RPC与WebService

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 虽然现在非常火的RPC技术以SpringCloud和Dubbo为主流 但是如果做接口调用 还是逃不了要用一些较传统的技术 前几天在做接口调用时恰巧用到了WebService
  • SQL代码——数据库,数据表代码操作

    数据库 创建数据库Create database db library 查看数据库show databases 选择数据库ues db library 删除数据库drop database db library 注 除了use不用写data
  • 致远OA检测工具-SeeyonExploit-GUI

    致远OA综合利用工具 项目地址 https github com linshaoSec SeeyonExploit GUI 致远OA A8 漏洞综合工具 v1 0 by linshao 支持批量一件扫描 后续会持续更新其他漏洞 现支持漏洞
  • 精彩!Facebook开源RAG,绕开重新训练,轻松修改已训练模型丨NeurIPS 2020

    AMiner平台由清华大学计算机系研发 拥有我国完全自主知识产权 平台包含了超过2 3亿学术论文 专利和1 36亿学者的科技图谱 提供学者评价 专家发现 智能指派 学术地图等科技情报专业化服务 系统2006年上线 吸引了全球220个国家 地
  • springsecurity oauth2中refresh token模式需要注意的点

    oauth2官方只有4种授权方式 不过springsecurity oauth2把refresh token也归为authorizedGrantTypes的一种 因此 springsecurity的oauth2实现有5中模式 authori
  • 【封装丨优雅方法】

    封装是个老生常谈的话题了 那么如何优雅的封装呢 不要急 本文下面就讲一讲优雅封装的几种方式 如何优雅的封装 一 封装的含义 二 优雅的封装 1 使用接口和抽象类 2 使用私有变量和公有方法 3 使用静态方法和常量 4 使用注解 5 使用枚举
  • 如何从Numpy 数组通过索引获取元素或切片

    一 一维numpy数组 一层 其中的元素为标量 a np array 1 2 3 4 5 6 gt gt gt a 2 取一个元素 得到一个标量 3 gt gt gt a 2 通过列表取1个元素 得到一个包含1个元素的1维数组 1层 arr
  • 解决VsCode下LaTex编译文件输出问题

    解决VsCode下LaTex编译文件输出问题 默认情况下 VsCode编译Latex文档时会将生成的pdf及其它一系列的文件保存在同主tex文件相同的目录下 这样的排版看起来会很混乱 所以在VsCode的配置文件中对其进行相关设置 指定编译
  • java-mybaits-00402-Mapper-动态sql-if、where、foreach、sql片段

    1 动态sql 重点 通过mybatis提供的各种标签方法实现动态拼接sql 什么是动态sql mybatis核心 对sql语句进行灵活操作 通过表达式进行判断 对sql进行灵活拼接 组装 需求 用户信息综合查询列表和用户信息查询列表总数这
  • 张钜楷:3.15黄金原油晚间是否会上涨呢?今日最新策略及分析操作

    注意 合理控制好仓位 切勿重仓或满仓操作 做单严格止损止盈 想了解更多资讯可关注 张钜楷希望大家一定要记住 投资 首先要学会控制风险 才能保证利润 切记带好止盈止损 带一个关键点位止损 把风险降到最低 口末亻言 jc98948 很多朋友问我
  • 完美解决Application context not configured for this file

    问题含义是 未为此文件配置应用程序上下文 换句话说就是没有将该文件配置到项目中 解决方式 第一步 首先点击显示的提示信息 Create Spring facet 第二步 在点击后的弹出页面中可以明显看到下方有个感叹号 不要慌 我们按下图操作
  • 黑苹果hd630显存7m_一次黑苹果的折腾记录——修改缓冲帧,解决显存只有7M,正确驱动Intel核显...

    一次黑苹果的折腾记录 修改缓冲帧 解决显存只有7M 正确驱动Intel核显 2020 09 19 19 16 18 18点赞 97收藏 22评论 你是AMD Yes党 还是intel和NVIDIA的忠实簇拥呢 最新一届 装机大师赛 开始啦
  • 开源实时监控 HertzBeat v1.3.2 发布, 更稳定更易用

    HertzBeat 介绍 HertzBeat赫兹跳动 是一个拥有强大自定义监控能力 无需 Agent 的开源实时监控告警工具 致力于易用友好 全WEB页面操作 鼠标点一点就能监控告警 零上手学习成本 集 监控 告警 通知 为一体 支持对应用
  • JS实现网站密码复杂度设置

    1 密码长度不小于8 if password length lt 8 alert 密码长度不小于8 return false 2 密码包含大写 小写字母和数字 var reg new RegExp A Z a z 0 9 if reg te
  • 4211 序列重排(构造、思维题--双关键字排序)

    1 问题描述 给定一个长度为 n 的整数序列 a1 a2 an 请你对序列进行重新排序 也可以保持原序列 要求新序列满足每个元素 第 1 个除外 都恰好是前一个元素的两倍或前一个元素的三分之一 保证输入一定有解 输入格式 第一行包含整数 n