浙大PAT 1067题 1067. Sort with Swap(0,*)

2024-02-26 22:08
文章标签 浙大 swap pat 1067 sort

本文主要是介绍浙大PAT 1067题 1067. Sort with Swap(0,*),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该题的思路很容易想到,不过若不注重技巧会超时。
若用数组v[]来容纳所有元素,该题目的目的就是通过最少的交换次数(注意只能必须是0与另一个数交换
来使得对于所有i均有v[i]== i,既然要求得最少交换次数,那就该尽量使每一次交换都能有一个元素被换到正确位置
(且该元素不会再次被交换),下面分两种情况讨论:
1. v[0] != 0:
   说明0不在正确位置上,那要通过变换使得v[0] == 0才行。此时该将0与该处在0所处的位置上的元素进行
交换,例如上面的举例{4, 0, 2, 1, 3},此时该将0与1(0所处的位置序号为1,即这本该是1所在的位置)交换,
通过类似的多次交换直到v[0] == 0;
2. v[0] == 0:
 此时0已在正确位置上了,但其他元素还没有全处于正确位置。所以必须得有一次废交换了(即交换后没
能使一个元素到达正确位置),怎么交换,肯定不能将0与一个已处在正确位置的元素交换吧(要不还得将这个元素
交换回来),所以肯定是将0与一个处于不正确位置的元素交换。
#include <stdio.h>
int findNotOK(int* arr,int begin,int end){	//从begin开始往后寻找未到位的数for(int i=begin;i<end;i++){if(arr[i]!=i)return i;}return 0;
}int main(){int n;scanf("%d",&n);int* arr = new int[n];int i,t;for(i=0;i<n;i++){scanf("%d",&t);arr[t]=i;}int tmp = 0;int count=0;int firstPos = 1;firstPos = findNotOK(arr,firstPos,n);while(firstPos){		//还有未到位的数字if(arr[0]==0){		//如果0到位了,则与未到位的firstPos交换	arr[0] = arr[firstPos];arr[firstPos] = 0;count++;}while(arr[0]!=0){	//如果0不到位,则循环与自己所指向的值交换tmp = arr[0];arr[0] = arr[tmp];arr[tmp] = tmp;count++;}firstPos = findNotOK(arr,firstPos,n);		//此时0归位了,找到下一个未到位的数字}printf("%d\n",count);return 0;
}




这篇关于浙大PAT 1067题 1067. Sort with Swap(0,*)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750313

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,front指向队头,rear指向队尾。 初始化栈顶为0,队头为0,队尾为-1 #include<iostream>using namespace std;#defi

linux定时监听ssh服务是否启动-------麒麟操作系统永久关闭swap

linux监听ssh服务是否启动 1、监听脚本2、定时任务3、麒麟操作系统,永久关闭swap 1、监听脚本 #在/usr/local/bin目录下新建脚本文件 cd /usr/local/bintouch check_sshd.sh#给可执行权限chmod +x /usr/local/bin/check_sshd.sh 脚本内容如下: #!/bin/bashs

浙大数据结构——03-树1 树的同构

这道题我依然采用STL库的map,从而大幅减少了代码量 简单说一下思路,两棵树是否同构,只需比较俩树字母相同的结点是否同构,即是否左==左,右==右或者左==右,右==左。 1、条件准备 atree和btree是存两个数结点字母,第几个就存输入的第几个结点的字母。 map通过结点的字母作为键,从而找到两个子节点的信息 都要用char类型 #include <iostream>#inc

浙大数据结构:堆栈和队列的定义与操作

堆栈: 顺序存储: #include<stdio.h>#include<stdlib.h>typedef int ElementType ;typedef int position ;#define MAXSIZE 100#define ERROR -1struct SNode {ElementType * Data ;position top;int Maxsize;};

PAT甲级-1044 Shopping in Mars

题目   题目大意 一串项链上有n个钻石,输入给出每个钻石的价格。用m元买一个连续的项链子串(子串长度可为1),如果不能恰好花掉m元,就要找到最小的大于m的子串,如果有重复就输出多个,按递增顺序输出子串的前端和后端索引。 原来的思路 取连续的子串使和恰等于m,没有恰等于就找最小的大于。可以将子串依次累加,使得每个位置都是起始位置到该位置的序列和,整个数组显递增顺序,就可以用右边减左边