有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

程序应该输出:
3

再例如,输入:
5
5 4 3 2 1

程序应该输出:
2

资源约定:
峰值内存消耗 < 256M
CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

思路:刚开始想到的是逆序数,但是看到第三个案例时就放弃了。然后是贪心,如果第i个位置 a[i] 的值不是 i ,那么就把 i 的值换回来,这个可以在输入时预处理一下,标记第 i 个值即 a[i] 在数组下标的哪个位置,然后在此循环交换就可以了,O(n)的复杂度。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstring>
#include<algorithm>
#include<cmath>
#define M 10000+5
using namespace std;int a[M];//原数组
int v[M];//标记数组 int  main(){int n; while(scanf("%d",&n)!=EOF){int ans=0;for(int i=1; i<=n; ++i){scanf("%d",&a[i]);v[a[i]]=i;//预处理 }for(int i=1; i<=n; ++i){if(a[i]!=i){swap(a[i],a[v[i]]);++ans;}}printf("%d\n",ans);}return 0;
}

【蓝桥杯】 交换瓶子相关推荐

  1. java实现第七届蓝桥杯交换瓶子

    交换瓶子 交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于 ...

  2. 蓝桥杯 交换瓶子 Java实现

    交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的 ...

  3. 蓝桥杯—交换瓶子—Java

    1.问题描述 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简 ...

  4. oj网站的训练题(蓝桥杯):交换瓶子

    有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的情况,显然 ...

  5. 蓝桥杯-【交换瓶子】【2016年省赛B组题解】【C++】

    2016年第七届蓝桥杯题目汇总 http://blog.csdn.net/qq_34202873/article/details/79646517 第九题: 交换瓶子 有N个瓶子,编号 1 ~ N,放 ...

  6. 蓝桥杯2016年C语言B组-交换瓶子

    蓝桥杯2016年C语言B组 交换瓶子 代码 交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的 ...

  7. 蓝桥杯ACM简单题-交换瓶子 2020-12-22

    蓝桥杯ACM简单题-交换瓶子 1.问题描述 有N个瓶子,编号 1 ~ N,放在架子上,要求每次拿起2个瓶子,交换它们的位置,依照大小排序. 2.算法分析 现任这是排序问题,在此使用寻找排序法 3.输入 ...

  8. 【蓝桥杯】交换瓶子(临阵磨枪,不快也光 一看就懂的简单图论)

    题目: 有N个瓶子,编号 1 ~ N,放在架子上.比如有5个瓶子: 2 1 3 5 4要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5对于这么简单的情况,显 ...

  9. 交换瓶子(蓝桥杯入门)

    交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的 ...

  10. 交换瓶子(蓝桥杯真题)

    交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的 ...

最新文章

  1. 数据挖掘的一些经典算法
  2. 火绒规则 禁止所有软件的安装_软件: Firefox 将禁止扩展静默安装
  3. 阿里达摩院:超大规模图神经网络系统将赋予机器常识
  4. 行货手机和水货手机究竟啥区别
  5. 基于python爬虫技术的应用_基于Python爬虫技术的应用
  6. 数字孪生及其在航空航天中的应用
  7. 20169302 2016-2017-2 《网络攻防实践》课程总结
  8. 擦拭法 java 泛型_廖雪峰Java4反射与泛型-3范型-4擦拭法
  9. 史密斯圆图串并联口诀_阻抗匹配与史密斯圆图基本原理『一』
  10. maya导入abc动画_外包过程中的动画重定向以及蒙皮调整经验
  11. Android如何实现超级棒的沉浸式体验
  12. 在资源管理器中隐藏指定分区
  13. 群晖Docker配置阿里云国际域名DDNS实现外网访问
  14. win10计算机管理没有蓝牙,Win10蓝牙在哪里?Win10蓝牙设置关闭或开启方法图解
  15. DSF学习1_Dubbo详解(一)分布式服务框架的概念理解
  16. 圣思园——Java SE Lesson 16
  17. 简单实现PDF转换为WORD,去水印
  18. EXCEL的查找:如何按 行号+列号 进行查询, 可用indirect() + match() 或 index() + match()
  19. 解决Zxing解析本地图片二维码,识别率低,识别不出来的问题!
  20. putty 遂道_为什么将网络隧道称为“隧道”?

热门文章

  1. linux中mfsort用法,Linux命令――sort
  2. 秒表项目_【速看】2021年陕西中考体育怎么考?中考体育项目及考试评分标准最全整理来了!...
  3. Spring注入方法
  4. LeetCode - 231. Power of Two
  5. 区块链开发_以太坊多重签名
  6. leetcode-581-Shortest Unsorted Continuous Subarray
  7. 使用Spring Session做分布式会话管理
  8. flash破解工具/flash decompiler
  9. Huffman(哈夫曼)编码--又称最佳编码(最有效的二进制编码)
  10. 天底下最大的“骗子”——年龄