让数组有序的最少交换次数

devtools/2024/10/18 22:31:40/

Trick : 让数组有序的最少交换次数

Problem One

1224. 交换瓶子 - AcWing题库

有 N 个瓶子,编号 1∼N,放在架子上。

比如有 5 个瓶子:

2 1 3 5 4

要求每次拿起 2 个瓶子,交换它们的位置。

经过若干次后,使得瓶子的序号为:

1 2 3 4 5

对于这么简单的情况,显然,至少需要交换 2 次就可以复位。

如果瓶子更多呢?你可以通过编程来解决。


记录每个位置的元素应该去的位置,会形成若干环。对于每个环,内部交换即可,交换次数即为 : 环的长度 - 1 。因为每次交换都会让一个位置有序,环的长度会减 -1。

int const N = 11000;
int n, a[N], to[N], vis[N];void solve(){cin >> n;for(int i = 1; i <= n; i ++){cin >> a[i];to[i] = a[i];}int res = 0;for(int i = 1; i <= n; i ++){if(vis[i]) continue ;int len = 0, now = i;while(vis[now] == false){vis[now] = true;len ++;now = to[now];}res += len - 1;}cout << res << '\n';
}

Problem Two

C-Sort4_2024牛客暑期多校训练营4 (nowcoder.com)

Given a permutation † \textstyle ^\dagger of length n \textstyle n n. In one operation, you can choose at most four elements from the permutation and swap their positions arbitrarily. What is the minimum number of operations required to sort the permutation in ascending order?

† \textstyle ^\dagger A permutation of length n \textstyle n n is an array consisting of n \textstyle n n distinct integers from 1 \textstyle 1 1 to n \textstyle n n in arbitrary order. For example, [ 2 , 3 , 1 , 5 , 4 ] \textstyle [2,3,1,5,4] [2,3,1,5,4] is a permutation, but [ 1 , 2 , 2 ] \textstyle [1,2,2] [1,2,2] is not a permutation ( 2 \textstyle 2 2 appears twice in the array), and [ 1 , 3 , 4 ] \textstyle [1,3,4] [1,3,4] is also not a permutation ( n = 3 \textstyle n=3 n=3 but there is 4 \textstyle 4 4 in the array).


不用于 Problem One, 本题每次可以选 4 4 4 个元素进行位置交换。

我们还是维护交换环,可以发现如下规律 :

对于长度为 1 1 1 的交换环,不需要进行操作 ;

对于长度为 2 2 2 的交换环,可以每次处理两个 ;

对于长度 ≥ 3 \geq3 3 的交换环,我们每次操作可以让环的长度减 3 3 3,直到环的长度 ≤ 4 \leq 4 4 时,如果长度为 3 3 3 4 4 4 , 一次操作 ;长度为 2 2 2 的,统一处理即可。

void solve(){int n;cin >> n;vector<int> a(n + 1), vis(n + 1), to(n + 1);for(int i = 1; i <= n; i ++){cin >> a[i];to[i] = a[i];}int res = 0, s = 0; // s : 2 环的数量for(int i = 1; i <= n; i ++){if(vis[i] || a[i] == i) continue ;int len = 0, now = i;while(vis[now] == false){len ++;vis[now] = true;now = to[now];}if(len % 3 == 2) len -= 2, s ++;else if(len % 3 == 1) len -= 4, res ++;res += len / 3;}cout << res + (s + 1) / 2 << '\n';
}

http://www.ppmy.cn/devtools/85979.html

相关文章

CTF之网站被黑

简单看一下网页和源码没发现什么明显漏洞 那就扫描一下目录 发现了/shell.php文件&#xff0c;访问一下&#xff0c;发现是一个后台管理登录页面 别无他法只能爆破喽&#xff0c;爆破后发现密码是hack flag{25891d9e9d377f006eda3ca7d4c34c4d}

【图解网络】学习记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 TCP/IP 网络模型有哪几层&#xff1f;键入网址到网页显示&#xff0c;期间发生了什么&#xff1f;Linux 系统是如何收发网络包的&#xff1f;NAPIHTTP 是什么&#…

C++学习笔记-内联函数使用和含义

引言 内联函数是C为了优化在函数的调用带来的性能开销而设计的&#xff0c;特别是当函数体很小且频繁调用时&#xff0c;内联函数可以让编译器在调用点直接展开函数体&#xff0c;从而避免了函数调用的开销。 一、内联函数的定义与含义 1.1 定义 内联函数是通过在函数声明或…

程序人生 - (002)

作为一名程序员&#xff0c;在编程和软件开发的过程中&#xff0c;通常会有一些深刻的感悟和体会。这些感悟不仅仅是关于技术的&#xff0c;也包括对工作的态度、职业的发展和人生的理解。 代码即逻辑&#xff1a;编写代码不仅仅是使用编程语言&#xff0c;更重要的是用逻辑思维…

单例模式懒汉模式和饿汉模式

线程安全 单例模式在单线程中&#xff0c;当然是安全的。但是如果在多线程中&#xff0c;由于并行判断&#xff0c;可能会导致创建多个实例。那么如何保证在多线程中单例还是只有一个实例呢? 常见的三种方式: 局部静态变量 原理和饿汉模式相似&#xff0c;利用static只会初始…

Kylin 入门教程

Apache Kylin 是一个开源的分布式数据仓库和 OLAP(在线分析处理)引擎,旨在提供亚秒级查询响应时间,即使在处理超大规模数据集时也是如此。Kylin 可以有效地将原始数据预计算为多维数据立方体(Cube),并利用这些预计算结果来提供快速查询。本文将带你从基础知识到操作实践…

前端实习手计(5):班味十足?!

自我感觉没有班味&#xff01;&#xff01;&#xff01;每天还是快快乐乐上班哇&#xff0c;是愉快的一周~这周没有太多活咯&#xff0c;基本就是修修改改改代码学习。真的感觉自己写的代码就是乱七八糟&#xff0c;只要能跑起来有效果就行&#xff08;我不是合格的处女座哈哈哈…

面向对象编程设计模式

UML中类图的表示方法 类图简介 在UML&#xff08;统一建模语言&#xff09;中&#xff0c;类图是使用频率最高的图形之一&#xff0c;用于描述系统中包含的类以及它们之间的相互关系。类图不仅帮助人们简化对系统的理解&#xff0c;也是系统分析和设计阶段的重要产物&#xf…