序列重排
序列重排
给定一个长度为 的整数序列 。
请你对序列进行重新排序(也可以保持原序列),要求新序列满足每个元素(第 个除外)都恰好是前一个元素的两倍或前一个元素的三分之一。
保证输入一定有解。
输入格式
第一行包含整数 。
第二行包含 个整数 。
输出格式
一行 个整数,表示排序后的序列。输出任意合法方案即可。
数据范围
前三个测试点满足 。
所有测试点满足 ,。
输入样例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
解题思路
首先这题保证有解。假设有满足题目要求的序列。用来表示第个数的因子的数量,用来表示第个数的因子的数量。
在这个序列中除了第个数外,对于第个数,要么是的两倍,即比多;要么是的,即比少。因此可以发现,对于任意一个数,它要么比前一个数的因子多,要么与前一个数的因子数量相同。因此有,即数列是递增的。
如果某一个数与它前一个数的因子的数量相同,即,由于这是一个合法的序列,因此必然有这个数的因子数量比前一个数的少,即。
因此我们可以得到一个必要条件,就是如果这是一个合法序列,那么必然有()或者(且)。这是一个必要条件,也就是说如果是一个合法序列那么这个序列一定满足这个必要条件。而如果某个序列满足必要条件,那么这个序列不一定是一个合法序列。
由于保证有解,因此对于任何一个序列重新排完序后,满足这个必要条件的序列是唯一的。下面来证明。
首先不会有任何两个数,的因子数量和因子的数量相同,即。反证法,假设存在这个情况的话,首先必然会是这个合法序列中的某两个位置,假设这两个数之间的数有,因为这是一个合法序列,因此有,由于,因此中间所有数的因子数量相等,即。因为是合法序列,因子的数量都相等,因此必然会有,这就与矛盾了。因此结论是如果要使序列可以变成合法序列,那么一定不会存在两个数的因子和因子的数量分别相等。因此序列中任何两个数的和不相等,根据双关键字排序,由于任何两个数都不会相等(即同时满足),因此每个数都有严格的大小顺序,因此他们排完序后的结果是唯一的。
所有,由于序列是有解的,因此不存在有两个数的因子和因子数量都分别相等,因此可以构造出一个满足必要条件的合法的序列,并且满足这个必要条件的序列是唯一的。
假设合法的序列是。我们根据双关键字排序后得到一个序列,这个序列满足必要条件,但不一定是合法的序列。又因为满足必要条件的序列是唯一的,因此就是。这是因为满足必要条件,也满足必要条件,因为一个序列满足必要条件不一定满足充分条件,但因为满足必要条件的序列是唯一的,因此满足必要条件的序列也会满足充分条件。
AC代码如下:
1 #include <cstdio> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 typedef long long LL; 7 8 const int N = 110; 9 10 vector<LL> a[N]; 11 12 int get(LL n, int b) { 13 int ret = 0; 14 while (n % b == 0) { 15 ret++; 16 n /= b; 17 } 18 return ret; 19 } 20 21 int main() { 22 int n; 23 scanf("%d", &n); 24 for (int i = 0; i < n; i++) { 25 LL val; 26 scanf("%lld", &val); 27 a[i] = {get(val, 2), -get(val, 3), val}; // 因为第二关键字要升序,因此乘个负号 28 } 29 30 sort(a, a + n); 31 32 for (int i = 0; i < n; i++) { 33 printf("%lld ", a[i][2]); 34 } 35 36 return 0; 37 }
参考资料
AcWing 4211. 序列重排(AcWing杯 - 周赛):https://www.acwing.com/video/3668/
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/16088480.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2021-04-01 在堆区申请二维数组的方法