Acwing---1224. 交换瓶子

news2024/12/25 9:02:05

交换瓶子

  • 1.题目
  • 2.基本思想
  • 3.代码实现

1.题目

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

比如有 5个瓶子:

2 1 3 5 4

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

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

1 2 3 4 5

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

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

输入格式
第一行包含一个整数 N,表示瓶子数量。

第二行包含 N 个整数,表示瓶子目前的排列状况。

输出格式
输出一个正整数,表示至少交换多少次,才能完成排序。

数据范围
1 ≤ N ≤ 10000 , 1≤N≤10000 , 1N10000,

输入样例1:

5
3 1 2 5 4

输出样例1:

3

输入样例2:

5
5 4 3 2 1

输出样例2:

2

2.基本思想

通过观察可以发现,我们每一个数都必须回到它自己的位置上,比如 1 必须在第一位,2 必须在第二位上

1.暴力枚举

由于每个数必须回到自己的位置,直接从 1 枚举到 n ,如果当前位置的数不等于它的下标,那么我们就必须要把它给替换掉
设当前位置为 i 的话,那么我们就从 i+1开始往后枚举,直到找到对应的 a[j] 和我们的 i 相等,那么我们就把上个数交换,把交换次数++

2.置换群算法/图论

当前位置的 i≠b[i]的话,那么它必然等于其他位置上的 b[i],那么我们可以利用图的存储方式来描述我们整个数组

在这里插入图片描述

分析可知 最终情况为 一个数字一个环,即一个长度为 n n n 的序列最多存在 n n n 个环.

且对于每一个环的操作,最多有两种情况,如下图所示,我们要么是在环内操作,要么就是跨环操作(环内操作就是在环内切换连接对象,环外操作就是在环与环之间切换连接对象),即操作一次最多增加一个环,假设当前有k个环,最终序列为n 即 n个环,至少需要n-k
`在这里插入图片描述

结论:当前k个环 最终 n个环,至少需要n-k个环

3.代码实现

暴力枚举

import java.util.Scanner;

public class Main {
    static Scanner sc = new Scanner(System.in);
    static int a[] = new int[10010];

    public static void main(String[] args) {
        int N = sc.nextInt();
        for (int i = 1; i <= N; i++)
            a[i] = sc.nextInt();

        int cnt = 0;
        for (int i = 1; i <= N; i++) {
            if (i != a[i]) {//当前位置不等 
                for (int j = i + 1; j <= N; j++) {
                    if (i == a[j]) {// 找到 交换
                        int temp = a[i];
                        a[i] = a[j];
                        a[j] = temp;
                        cnt++;
                    }
                }
            }
        }
        System.out.println(cnt);
    }
}

置换群算法

import java.util.Scanner;

public class _1224交换瓶子 {
    static int N = 10010;
    static Scanner sc = new Scanner(System.in);
    static int bottle[] = new int[N];
    static boolean st[] = new boolean[N];

    public static void main(String[] args) {
        int n = sc.nextInt();
        for (int i = 1; i <= n; i++)
            bottle[i] = sc.nextInt();

        int cnt = 0;//统计环数
        for (int i = 1; i <= n; i++) {
            if (!st[i]) {//当前 位置点没被找过 表明在新的环中
                cnt++;
                //把该点 可以到达的所有点进行标记
                for (int j = i; !st[j]; j = bottle[j]) st[j] = true;
            }
        }

        System.out.println(n-cnt);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/183197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第26天】SQL进阶-查询优化- performance_schema系列实战二:锁问题排查(MDL锁)(SQL 小虚竹)

回城传送–》《32天SQL筑基》 文章目录零、前言一、什么是MDL锁二、什么时候适合加MDL锁三、 实战演练3.1 数据准备&#xff08;如果已有数据可跳过此操作&#xff09;3.2 开启第一个会话&#xff0c;显式开启一个事务&#xff0c;并执行一个update语句不提交3.3 开启第二个会话…

机器自动翻译古文拼音 - 十大宋词 - 水调歌头 明月几时有 苏轼

水调歌头明月几时有 北宋苏轼 明月几时有&#xff0c;把酒问青天。 不知天上宫阙&#xff0c;今夕是何年。 我欲乘风归去&#xff0c;又恐琼楼玉宇&#xff0c;高处不胜寒。 起舞弄清影&#xff0c;何似在人间&#xff1f; 转朱阁&#xff0c;低绮户&#xff0c;照无眠。 不应…

idea 配置tomcat 运行jsp项目

1、复用idea打开jsp项目 2、添加tomcat配置 3、点击后会出现配置框,这里画框的地方都选上&#xff0c;版本选择1.8&#xff0c;其他的信息内容默认后&#xff0c;点击确认 4、点击 File->Project Structure,弹出界面选择Project&#xff0c;这里sdk选择1.8&#xff0c;语言选…

#7反转链表#

反转链表 1题目链接 链接 2思路 思路1(暴力): 定义两个指针或者三个指针 这里选择三个指针 清晰一点 头部 头部的下一个 头部的下一个的下一个 n1 n2 n3 做好n2和n1的连接: n2->nextn1 然后: n2n1 n3n2 n3n3->next 相当于三个指针都往…

JAVA混合使用函数式接口(BiPredicate和Consumer)、泛型、lambda表达式、stream流,优化List求交集和差集后的通用处理

文章目录前言项目场景两个List求交集和差集BiPredicate和Consumer基本介绍优化目标一步步优化代码最后前言 本文主要讲的是一个小的功能代码的优化案例&#xff0c;用到的知识点主要包括函数式接口&#xff08;BiPredicate和Consumer&#xff09;、泛型、lambda表达式、stream…

100天精通Python(数据分析篇)——第73天:Pandas文本数据处理方法之查找、替换、拼接、正则、虚拟变量

文章目录每篇前言一、Python字符串内置方法1. 文本查找2. 文本替换3. 文本拼接4. 正则提取二、Pandas实现文本查找1. str.startswith(字符串)2. str.endswith(字符串)3. str.index(字符串, start0, endlen(string))4. str.rindex(字符串, start0, endlen(string))5. str.find(字…

工具技巧和读文档 | 读函数式编程接口文档 | 匿名内部类 | lambda表达式 |IDEA

Function接口&#xff0c;函数式接口 按入参返回值分类&#xff0c;大概分为4种类型&#xff0c;再加上多个入参就又多了Bi开头的两种。 有CtrlP的时候不懂参数列表该写啥&#xff0c;就先CtrlALT看下入参类型的相关实现类&#xff01; 一些实用的快捷键&#xff1a;Ctrl P看参…

AORT:一款功能强大的多合一网络侦查与数据收集工具

关于AORT AORT是一款功能强大的多合一网络侦查与数据收集工具&#xff0c;该工具的主要目的是帮助漏洞Hunter和渗透测试人员完成网络侦查环节的各类任务。AORT基于Python开发&#xff0c;使用起来非常简单且方便&#xff0c;并且支持跨平台&#xff08;只要安装了Python 3即可…

怒删虚拟机,FPGA开发新宠-几步在Windows上安装桌面化Linux

Linux上运行Vivado这类EDA工具要比Window上快很多&#xff0c;大概就是优化的问题&#xff0c;所以选择Linux上开发是一个比较好的选择&#xff08;主要是免费&#xff09;。国内习惯了Win系统&#xff0c;所以用Linux比较少&#xff0c;那么有没有既可以在Windows上做一些文档…

Python爬虫(4)-Selenium模拟鼠标操作

在Selenium4.2以后的版本里面鼠标的操作方法都封装在了ActionChains中需要时直接取即可。 1.鼠标双击 使用方法就是调用ActionChains然后传入你需要点击的按钮的位置即可 ActionChains(driver).double_click(f1).perform() perform()的意思就是执行所有ActionChains中的动作 …

python字典应用

python字典应用 文章目录python字典应用一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤字典的综合案例使用collections模块的defaultdict类来实现创建字典。拓展知识一&#xff1a;内置函数globals()和locals()拓展知识二&#xff1a;有序字典 collections.Ord…

如何使用MyBatis简化JDBC开发?MyBatis持久层框架快速入门

文章目录1. 前言2. JDBC 存在的缺点3. MyBatis 优化4. MyBatis 快速入门5. 总结Java编程基础教程系列1. 前言 JavaEE 企业级 Java 项目中的经典三层架构为表现层&#xff0c;业务层和持久层&#xff0c;使用Java 代码操作数据库属于持久层内容&#xff0c;而 MyBatis 对 JDBC …

Multus k8s网络浅谈

Multus是什么 k8s不提供网络解决方案&#xff0c;提供CNI ( Container Networking Interface )规范&#xff0c;被CNI插件遵守&#xff08;Flannel, Calico&#xff0c;Multus等&#xff0c;这些是网络方案&#xff09; Multus 提供了将多个接口添加到pod的功能 Flannel 为每…

实现自己的数据库三

一 前言上篇实现了数据库的持久化&#xff0c;就是一个质的飞跃&#xff0c;虽然代码不复杂&#xff0c;但是对没有这方面经验者来说&#xff0c;还是意思的&#xff0c;下一步就是要完成另外一个飞跃&#xff0c;将存储的数据结构采用B树的形式来保存。在改造之前&#xff0c;…

为什么要设计非公平锁?

背景 公平&#xff1a;排队 非公平&#xff1a;在合适时机插队 非公平还是 ReentrantLock 的默认策略&#xff0c;排队时间不浪费了&#xff1f; 场景 来看这种场景 假如A持有一把锁&#xff0c;B请求这把锁&#xff0c;这时候B被挂起进入阻塞&#xff0c;A释放锁的时候&a…

点与线段的关系

点与线段的关系 对于向量a(x1,y1)和b(x2,y2) 点乘的数学意义&#xff1a;a * b x1x2 y1y2 点乘的几何意义&#xff1a;a * b |a||b|cosQ 这个可以看成是投影关系表达式&#xff1a;cosQ a * b / ( |a||b|) 令r cosQ&#xff1b; 求p点和线段AB的位置关系&#xff0c;可以…

将字符串根据指定的分隔符拆分为元组str.partition()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将字符串根据指定的分隔符拆分为元组 str.partition() 选择题 对于以下python代码最后输出的结果是? string "I Love Python" print("【显示】string.partition(Love)"…

Unity3d 微信小程序(小游戏)项目实现流量主接入功能(含源码)

前言 很早之前编写了Unity导出微信小游戏的博客&#xff0c;也尝试自己做了个Demo上线了&#xff0c;基本没更新过&#xff0c;不过几个月的时间&#xff0c;用户超过了一千&#xff0c;可以开通流量主了&#xff0c;大概率是因为上篇的帖子浏览量大了&#xff0c;扫码体验的人…

Aurora、Chip2chip、Ethernet(二)

摘要&#xff1a;Aurora、Chip2chip、Ethernet共用一个gt时钟的正确的解决方案以及在实际实现以及在实现过程中遇到的其它的问题。 我在实际中遇到的困难如下&#xff1a; 现在需要将三个ip共用一对GT时钟&#xff0c;一个Ethernet IP&#xff0c;一个Ethernet IP&#xff08…

每日学术速递1.29

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1. Compact Transformer Tracker with Correlative Masked Modeling 标题&#xff1a;带有相关掩码建模的紧凑型变压器跟踪器 作者&#xff1a; Zikai Song, Run Luo, Junqing Yu, Y…