蓝桥杯题目练习 提升篇 [蓝桥杯2016初赛]交换瓶子

交换瓶子

题目描述

有N个瓶子,编号 1 ~ N,放在架子上。
比如有5个瓶子:2 1 3 5 4,要求每次拿起2个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:1 2 3 4 5
对于这么简单的情况,显然,至少需要交换2次就可以复位。
如果瓶子更多呢?你可以通过编程来解决。

输入

输入存在多组测试数据,对于每组测试数据:
第一行: 一个正整数N(N<10000), 表示瓶子的数目
第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。

输出

对于每组测试数据输出一行,包含一个正整数表示答案

样例输入 Copy

5
3 1 2 5 4
5
5 4 3 2 1

样例输出 Copy

3
2

代码

思路在代码里面

#include<iostream>
#include<stdio.h>
using namespace std;
/*
	因为N个瓶子的编号就是1~N,所以每个瓶子本来应该在的位置就是自身编号的位置。
	我们要做的就是从第一个数开始判断当前瓶子是否在它本来的位置,如果不在则和它本来位置上的瓶子进行交换。
	复杂度O(N) 
*/
int a[10005];// a[]用来存当前数列的瓶子
int b[10005];// b[]用来存储i号瓶子的位置 
int main(){
	int N;
	int id;
	int sum;
	int id1,id2;//id1,id2为两个瓶子的编号 
	int pos1,pos2;//需要交换的两个瓶子的位置 
	while(scanf("%d",&N)!=EOF){
		for(int i=1;i<=N;i++){
			cin>>id;
			a[i]=id; //把当前瓶子排放顺序放入a[]数组中
			b[id]=i; //把编号为id的瓶子当前所在的位置存储到b[]数组中 
		}
		/*
		5
		3 1 2 5 4
		a[1]=3; a[2]=1 a[3]=2 a[4]=5 a[5]
		b[3]=1; b[1]=2 b[2]=3 b[5]=4 b[4]=5 
		*/ 
		sum=0;//初始化交换次数
		for(int i=1;i<=N;i++){
			//如果当前位置瓶子的编号正好等于当前位置的序号,说明这个瓶子在它本来的位置,直接跳过本次循环 
			if(a[i] == i) continue; 
			//到这一步,说明当前位置瓶子不在它本来应该在的位置,需要和它本来的位置上的瓶子交换
			//此时的i表示第i个位置,a[i]表示第i个位置瓶子的编号。
			//第i个位置应该存放的是编号为i的瓶子,但是编号为i的瓶子在编号为a[i]的瓶子的位置上 
			//b[a[i]]表示第i个位置瓶子它本来应该在的位置。
			//所以此时需要让id1指向a[i]这个瓶子,pos1指向第i个位置
			id1=a[i]; //获取当前位置存放的瓶子的编号 
			pos1=i; //当前所在位置 
			
			//pos2指向编号为a[i]的瓶子本来应该在的位置,id2指向编号为i的瓶子
			id2=i;   
			pos2=b[i];  //找到i号瓶子所在的位置 
			
			sum++;//操作数+1;
			
			//交换操作,把 
			a[pos2]=id1;//瓶子2的位置(pos2)放瓶子1(id1) 
            b[id1]=pos2;//瓶子1(id1)放到瓶子2的位置(pos2) 
            //瓶子2放到瓶子1的位置 
            a[pos1]=id2;//瓶子1的位置放瓶子2 
            b[id2]=pos1;//瓶子2放到瓶子1的位置 
			 
		} 
		cout<<sum<<endl;
	}
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 历届蓝桥杯单片机国赛题目的pdf文件包含了多年来比赛的题目,对于参赛者来说非常有价值。这些题目主要涉及单片机的应用,包括各种实际问题的解决方案设计和实现。 蓝桥杯单片机国赛的题目非常好,具有一定的难度和挑战性。在这些题目中,可以看出组织者对参赛者的考察点,如编程基础、算法设计、电路原理和PCB设计等方面的能力要求。 这些题目的难度和要求因年份而异。一些题目可能要求参赛者按照给定的要求,设计和实现具体的功能,比如控制器的编程和接口的设计。还有一些题目则更注重算法的设计和优化,要求参赛者解决一些实际问题,如传感器数据采集和处理、自动控制系统设计等。 参赛者可以通过阅读历届蓝桥杯单片机国赛题目的pdf,了解以往比赛的题目类型和要求。同时,可以从中学习其他选手的优秀作品,借鉴他们的思路和方法,不断提高自己的编程水平和解决问题的能力。 总的来说,历届蓝桥杯单片机国赛题目pdf是参赛者备战比赛的重要资料,通过认真研读和思考这些题目,可以帮助参赛者更好地了解比赛的要求和考察点,为自己的比赛表现做好准备。同时,也可以通过学习其他选手的优秀作品,借鉴他们的经验和方法,提升自己的编程和设计能力。 ### 回答2: 历届蓝桥杯单片机国赛题目pdf经过多年的发展和举办,已经形成了一套完整的题库。这些pdf文件收录了每年蓝桥杯单片机国赛的题目,包括初赛和决赛的所有题目。通过这些pdf文件,参赛选手可以了解到历年比赛中的难度和类型,为他们的备战提供了很好的参考。 每年的比赛题目都由蓝桥杯组委会精心设计,力求在知识点的全面性和难度上有所考量。题目内容通常包括单片机基础知识、电路设计、编程能力等方面的要求。比赛题目除了要求选手具备一定的硬件和软件实验能力外,还要求选手具备良好的分析和解决问题的能力。 通过历届蓝桥杯单片机国赛题目pdf的学习,可以帮助选手更好地了解比赛要求,熟悉比赛形式和题型,提高应对复杂问题的能力。同时,这些题目也对教育者具有一定的参考价值,可以作为培训学生的教材和示例。 总之,历届蓝桥杯单片机国赛题目pdf对于参赛选手和教育者来说都是非常有价值的资源。通过对这些题目的学习和分析,可以更好地为比赛做好准备,并提高自身的技能水平。希望未来蓝桥杯单片机国赛题目pdf会进一步完善,为单片机爱好者提供更好更全面的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值