PTA与零交换

PTA A1067 Sort with Swap(0, i)理解思路(如何记录与交换) 核心理解点 题目的意思是每次只能用0和另一个数进行交换。 所以这里想的是,尽可能每次都往正确的位置上换。 所以,一个数组,谁来作为键,谁来作为值,就很重要了。这里要交换,数字是不变的,变化的是数字的位置,所以,用一个for循环,可以把初始的位置,以值得形式记录下来。 关于交换得误区 比如,一开始0的位置是7,这个位置7的正确值应该是数字7,所以,0要和7交换位置。交换之后,数字7就归位... 阅读详情

作者 陈越

单位 浙江大学

将 { 0, 1, 2, ..., N-1 } 的任意一个排列进行排序并不困难,这里加一点难度,要求你只能通过一系列的 Swap(0, *) —— 即将一个数字与 0 交换 —— 的操作,将初始序列增序排列。例如对于初始序列 { 4, 0, 2, 1, 3 },我们可以通过下列操作完成排序:

  • Swap(0, 1) ⟹ { 4, 1, 2, 0, 3 }
  • Swap(0, 3) ⟹ { 4, 1, 2, 3, 0 }
  • Swap(0, 4) ⟹ { 0, 1, 2, 3, 4 }

本题要求你找出将前 N 个非负整数的给定排列进行增序排序所需要的最少的与 0 交换的次数。

输入格式:

输入在第一行给出正整数 N (≤105);随后一行给出{ 0, 1, 2, ..., N-1 } 的一个排列。数字间以空格分隔。

输出格式:

在一行中输出将给定序列进行增序排序所需要的最少的与 0 交换的次数。

输入样例:

10
3 5 7 2 6 4 9 0 8 1

输出样例:

9

题目大意:

让数组里的数都和0交换位置,问最少需要多少次?

思路:
将一个完全混乱的数组变成升序最少需要数组的长度-1次。

比如:1 5 4 2 3 0 或者 9 45 8 23 62 57 这两个数组最小数交换位置变成升序都需要5次。

我们可以把相连的数字看成环。

那么看样例:

0 1 2 3 4 5 6 7 8 9
3 5 7 2 6 4 9 0 8 1
!  # !  !  # # # !  *  #

这时候就有发现一个问题,8已经在自己的位置上,那么就不需要换。至此,我们可以把环分成3类。

1、自环,不需要换位置。

2、环中间有0,交换次数为环的长度-1。

3、环中间没0,把0放入环中(交换次数+1),环的长度+1,交换次数为环的长度。

方法:

用dfs查询每个环的长度,在查询时判断环中有没有0。

ll dfs(ll x){//查询环 
	ll sum=0;//环的长度 
	if(vis[x])return sum;//查询到查询过的点返回此时的长度 
	vis[x]=1;//标记此点已经查询过 
	sum+=dfs(v[x])+1;//环的长度+1 
	if(x == 0)f=1;//判断0 
	return sum;//返回长度 
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n"

const ll N = 1e5+7;
ll n;
bool f;//判断环中是否有0 
ll v[N];//记录数字 
bool vis[N];//标记是否查询过此点 

ll dfs(ll x){//查询环 
	ll sum=0;//环的长度 
	if(vis[x])return sum;//查询到查询过的点返回此时的长度 
	vis[x]=1;//标记此点已经查询过 
	sum+=dfs(v[x])+1;//环的长度+1 
	if(x == 0)f=1;//判断0 
	return sum;//返回长度 
}

void solve(){
	cin >> n;
	ll sum=0;
	for(ll i = 0 ; i < n ; i ++){
		cin >> v[i];
		if(v[i] == i)vis[i]=1;//把自环判出 
	}
	for(ll i = 0 ; i < n ; i ++){
		if(vis[i])continue;
		f=0;
		ll c=dfs(i);
		if(f)sum+=c-1;
		else sum+=c+1;
	}
	cout << sum << endl;
	return ;
}

int main(){
	ll t=1;//cin >> t;
	while(t--)solve();
	return 0;
}

C++ 从0开始的数组下表排序,插入排序、交换排序、选择排序,归并排序 数组下标从0开始的排序,其中包含了各种对数组排序的方法,有插入排序(直接插入排序、希尔排序),交换排序(起泡排序、快速排序),选择排序(简单选择排序,堆排序)、归并排序(递归,非递归)。 立即下载

相关推荐

SpyGlass CDC实战:如何用sgdc约束文件解决跨时钟域报错(附常见错误排查)

本文详细介绍了如何使用SpyGlass CDC工具编写sgdc约束文件解决跨时钟域(CDC)报错问题。从基础语法到实战案例,涵盖时钟声明、复位约束、路径豁免等关键技巧,特别针对SPI断续时钟等特殊场景提供解决方案,并附常见错误排查指南,帮助工程师高效完成CDC验证。

weixin_28744423的博客 625

数据结构PTA 案例7-1.5 与零交换

案例7-1.5 与零交换题目解法 题目 将 { 0, 1, 2, …, N-1 } 的任意一个排列进行排序并不困难,这里加一点难度,要求你只能通过一系列的 Swap(0, *) —— 即将一个数字与 0 交换 —— 的操作,将初始序列增序排列。例如对于初始序列 { 4, 0, 2, 1, 3 },我们可以通过下列操作完成排序: Swap(0, 1) ⟹ { 4, 1, 2, 0, 3 } Swap(0, 3) ⟹ { 4, 1, 2, 3, 0 } Swap(0, 4) ⟹ { 0, 1, 2, 3, 4

Echooo的博客 1669

实战拆解:RAG vs Agent在金融风控中的性能对比

2024年上半年我帮某华东地区城商行做零售交易反欺诈系统升级时,技术团队曾发生过一次激烈争论:一派认为应该优先上RAG(检索增强生成)方案,成本低、落地快、合规性好;另一派坚持要上Agent(智能体)方案,推理能力强、能应对复杂新型欺诈。最终我们做了完整的AB测试,结论是两者没有绝对的优劣,只有场景适配的差异:RAG适合高并发、低时延的实时风控场景,Agent适合低并发、高准确率要求的事后核查/大额审批场景,两者结合的 hybrid 方案能覆盖95%以上的风控需求。本文我会结合真实项目的测试数据,从核心概念

AI天才研究院 251

案例7-1.5:与零交换

将 { 0, 1, 2, …, N-1 } 的任意一个排列进行排序并不困难,这里加一点难度,要求你只能通过一系列的 Swap(0, *) —— 即将一个数字与 0 交换 —— 的操作,将初始序列增序排列。例如对于初始序列 { 4, 0, 2, 1, 3 },我们可以通过下列操作完成排序: Swap(0, 1) ⟹ { 4, 1, 2, 0, 3 } Swap(0, 3) ⟹ { 4, 1, 2, 3, 0 } Swap(0, 4) ⟹ { 0, 1, 2, 3, 4 } 本题要求你找出将前 N 个非负整数的

m0_51717226的博客 2009

MACS2软件进行Peak calling

MACS2可以检出ChIP-Seq,ATAC-seq 以及 MeRIP-seq (RNA甲基化测序) 等富集的序列。peaks calling 有不同的方法,MACS2是最常用的call peaks工具。 MACS全称Model-based Analysis of ChIP-Seq,最初的设计是用来鉴定转录因子的结合位点,但是它也可以用于其他类型的富集方式测序。usage: macs2 [-h] [--version] {callpeak,bdgpeakcall,bdgbroadca

qq_27390023的博客 3789

基于MATLAB的基本数字调制解调系统的设计

基于MATLAB的基本数字调制解调系统的设计一、摘要现代通信系统要求通信距离远、通信容量大、传输质量好,作为其关键技术之一的调制解调技术一直是人们研究的一个重要方向。本文以MATLAB为软件平台,充分利用其提供的通信工具箱和信号处理工具箱中的模块,对数字调制解调系统进行Simulink设计仿真,并且进行误差分析。调制与解调是通信系统中十分重要的一个环节,针对不同的信道环境选择不同的调制与解调方式可...

m0_55395440的博客 5549

PTA 与零交换

将 { 0, 1, 2, ..., N-1 } 的任意一个排列进行排序并不困难,这里加一点难度,要求你只能通过一系列的 Swap(0, *) —— 即将一个数字与 0 交换 —— 的操作,将初始序列增序排列。本题要求你找出将前 N 个非负整数的给定排列进行增序排序所需要的最少的与 0 交换的次数。

xjc1481612876的博客 340

信创改造实战:SpringBoot项目迁移到宝兰德BES 9.5.5的完整避坑指南(附依赖与web.xml配置)

本文详细介绍了将SpringBoot项目迁移到宝兰德BES 9.5.5的完整流程,包括依赖改造、web.xml配置降级等关键步骤。通过实战案例和避坑指南,帮助开发者高效完成国产中间件适配,确保项目平稳运行。特别针对Tomcat依赖排除和BES适配器选择提供了专业建议。

weixin_30689307的博客 737

PTA | 与零交换

将 { 0, 1, 2, ..., n−1 } 的任意一个排列进行排序并不困难,这里加一点难度,要求你只能通过一系列的 Swap(0, *) —— 即将一个数字与 0 交换 —— 的操作,将初始序列增序排列。输入在第一行给出正整数 n (≤105);随后一行给出{ 0, 1, 2, ..., n−1 } 的一个排列。本题要求你找出将前 n 个非负整数的给定排列进行增序排序所需要的最少的与 0 交换的次数。在一行中输出将给定序列进行增序排序所需要的最少的与 0 交换的次数。

2201_75933169的博客 587

汽车零部件产线实战:C#上位机+YOLO实现螺栓装配到位视觉检测

本项目基于C#上位机+YOLOv8实现汽车零部件产线螺栓装配到位视觉检测,全程贴合产线实际场景,从硬件选型、安装调试,到模型训练、上位机开发,再到项目联调、优化扩展,均提供手把手实操指导,代码可直接复制使用,规避了工业视觉产线检测的高频踩坑点。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1330

8.9华为OD机试真题 新系统 - 查找最佳充电策略 (Java/Py/C/C++/Js/Go)

8.9华为OD机试真题 新系统 - 查找最佳充电策略 (Java/Py/C/C++/Js/Go)

算法大师! 1161

排序之与零交换

将 { 0, 1, 2, ..., N-1 } 的任意一个排列进行排序并不困难,这里加一点难度,要求你只能通过一系列的 Swap(0, *) —— 即将一个数字与 0 交换 —— 的操作,将初始序列增序排列。首先找到0所在位置,然后找该位置应该放的数所在的位置,然后交换这两个位置上的数,有一种情况需要特别判断,当0所在位置为0的位置时,随便找一个位置不正确的数所在位置进行交换。输入在第一行给出正整数 N (≤105);随后一行给出{ 0, 1, 2, ..., N-1 } 的一个排列。

笔记 864

大模型_WIN10使用hyper-v安装Ubuntu24.04虚拟机_配置独立静态IP地址_连接外网_并与内网其他机器互通_通过容器安装Dify_超详细安装过程002--人工智能工作笔记0247

本文详细描述了在Hyper-V环境中配置网络、安装Ubuntu虚拟机、设置IP地址、安装Docker以及部署Dify应用的过程。首先,通过Hyper-V管理器创建外部虚拟交换机(ExternalSwitch),并配置本机、虚拟交换机和Ubuntu虚拟机的IP地址,确保网络互通。接着,在Ubuntu虚拟机中安装Open-VM-Tools和Docker,并配置Docker的国内镜像源。最后,通过Git克隆Dify源码,使用Docker Compose启动Dify应用,完成部署。整个过程涵盖了网络配置、虚拟机管理

添柴程序猿的专栏 1750

【数据结构 | PTA】与零交换

将 { 0, 1, 2, …, n−1 } 的任意一个排列进行排序并不困难,这里加一点难度,要求你只能通过一系列的 Swap(0, *) —— 即将一个数字与 0 交换 —— 的操作,将初始序列增序排列。输入在第一行给出正整数 n (≤10的5次方);随后一行给出{ 0, 1, 2, …, n−1 } 的一个排列。本题要求你找出将前 n 个非负整数的给定排列进行增序排序所需要的最少的与 0 交换的次数。在一行中输出将给定序列进行增序排序所需要的最少的与 0 交换的次数。

等风来 2053

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【PTA数据结构 | C语言版】与零交换

将 { 0, 1, 2, …, n−1 } 的任意一个排列进行排序并不困难,这里加一点难度,要求你只能通过一系列的 Swap(0, *) —— 即将一个数字与 0 交换 —— 的操作,将初始序列增序排列。例如对于初始序列 { 4, 0, 2, 1, 3 },我们可以通过下列操作完成排序

等风来 441

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

案例7-1.5 与零交换 (25 分)

案例7-1.5 与零交换 (25 分) 组合数学的圈问题,不懂的仔细模拟一下代码。 #include<cstdio> #include<cmath> #include<cstring> #include<iostream> using namespace std; const int N=1e5+10; int a[N],vis[N],ret; void dfs(int x) { if(vis[x]) return; ret++; vis[x]=1;

努力刷题中 410

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PTA 10-排序6 Sort with Swap(0, i) 贪心法和数环法两种解法对比分析

PTA-mooc完整题目解析及AC代码库:PTA(拼题A)-浙江大学中国大学mooc数据结构全AC代码与题目解析(C语言) Given any permutation of the numbers {0, 1, 2,…, N−1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY op...

zhuiyisinian的博客 287

PTA Sort with Swap(0, i)

置换、图论

ACoder 343

【PTA] - 1067 Sort with Swap(0,*) (25 分)

题意: 求只交换0这个数字,使得数集可以升序排列 方法:贪心 /** * 贪心: * 1. 如果0不在本来的位置上,就将0所在位置的数与0的位置交换 * 2.如果0在本来的位置上,就寻找一个不在本来位置上的数字与0进行交换 */ #include <iostream> #include <cstdio> #include <algorithm>...

https://github.com/Wheeeeeeeeels 192

2016-第七届蓝桥杯省赛 c/c++大学B组--- (组合数学的圈问题)交换瓶子

有N个瓶子,编号 1 ~ N,放在架子上。 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置。 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的情况,显然,至少需要交换2次就可以复位。 如果瓶子更多呢?你可以通过编程来解决。 输入格式为两行: 第一行: 一个正整数N(N<10000), 表示瓶子的数目 第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。 输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。 例如,输入: 5 3 1 2 5 4

chstor's blog 757

map映射-----基础实验8-1.2 直捣黄龙 (30分)

本题是一部战争大片 —— 你需要从己方大本营出发,一路攻城略地杀到敌方大本营。首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营。当这样的路径不唯一时,要求选择可以沿途解放最多城镇的路径。若这样的路径也不唯一,则选择可以有效杀伤最多敌军的路径。 输入格式: 输入第一行给出2个正整数N(2 ≤ N ≤ 200,城镇总数)和K(城镇间道路条数),以及己方大本营和敌方大本营的代号。随...

hellobettershero的博客 356

(c语言)Sort with Swap(0, i) (25分)

关于数据结构Mooc后的每一道答案 基本我都已经给出了详解 希望能对大家有所帮助 收藏一下也是方便大家查找吧 希望大家一起进步! (c语言)浙大数据结构Mooc作者答案集 原题谷歌翻译 AC运行结果截图 闲谈 终于这道题做了 今天下午就到了 最后的散列表了 回想起这一个多月的数据结构的学习 也快进入尾声了 我去看看我学了多久了 我是从 2020/11/15 09:50:14开始进入PTA做题 差不多快30多天一点了 可能最多还有1天多也就结束课程了 陈越姥姥确实讲的很好 但是我觉得还是

Love 6's Private Blog 601

7-29 与零交换(超详细思路解析,其实可以只用数组解)

将 { 0, 1, 2, ..., N-1 } 的任意一个排列进行排序并不困难,这里加一点难度,要求你只能通过一系列的 Swap(0, *) —— 即将一个数字与 0 交换 —— 的操作,将初始序列增序排列。例如对于初始序列 { 4, 0, 2, 1, 3 },我们可以通过下列操作完成排序: Swap(0, 1)⟹{ 4, 1, 2, 0, 3 } Swap(0, 3)⟹{ 4, 1, 2, 3, 0 } Swap(0, 4)⟹{ 0, 1, 2, 3, 4 } 本题要求你找出将前 N 个...

daybreak_alonely的博客 880

C++笔试题——只使用0与数组中其它数交换进行排序

题目:一个长度为n的数组,乱序存放着[0, n-1],现在只允许0与其它数交换,将数组排序 从小到大排列的解题思路:将0依次从下标1移至下标n-1的位置,在移动过程中,如果当前位置i上的数已经是i了就直接进行下一步,若不是,就将0所在的位置替换成与下标相等的数,最后,判断位置0上的数字是不是0,如果不是,就将最后一个位置上的数字和0交换 从大到小排列的思路:将0依次从下标0移至下标n-2的位置...

whocarea的博客 822

PTA 1067(另外做法)

Given any permutation of the numbers {0, 1, 2,…, N−1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2...

y2001tm的博客 328

0交换排序

import java.util.Arrays; public class SwapWithZeroSort { public static void main(String[] args) { int[] array={2,0,1}; sort(array); System.out.println(Arrays.toString(array)); } //0交换排序 pu

lwtb的博客 2441
上一篇: D. Decrease the Sum of Digits Codeforces Round 667 (Div. 3)
下一篇: PTA家庭房产
翰墨织梦
博客等级 码龄4年 384粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值