1224. 交换瓶子

暴力解法:

题解

这种暴力解法长得很像选择排序。
选择排序是分为1 ~ i的有序区 i+1 ~ n的无序区。在无序区中找一个最小的,然后放入无序区的第一个位置。

这个题也是这样,分为1 ~ i的有序区和 i+1 ~ n的无序区。在无序区中找的是a[j] == i+1的,然后交换,这样a[i+1] 就 = i+1.


置换群解法:

  1. 一共有n个瓶子 最多交换n-1次

1 2 3 4 5
5 4 3 2 1要得到上面就需要交换4次

  1. 直接想比较难 转化为一个图论的题 一个瓶子为一个点。瓶子的编号连接到位置为该瓶子编号的点。这样连接起来必定是一个环。这样的一个环被称为一个置换。希望得到的最终的位置 是1->1 2->2 3->3 4->4 5->5所以最终是N个连接自己的环

1 2 3 4 5
3 1 2 5 4 3->3 1->1 2->2 5->5 4->4 箭头后面点的为上面一行的点



假设初始有K个环 最后要得到n个环 由于一次操作减少一个环,所以要进行n-k次操作,才能得到n个环。

如何找一个环?

开一个bool数组st[N],随便找一个点开始遍历,把他能到的全部设置st = 1就找到了一个环。


所以找到一开始有几个环 然后操作几次呢? 一开始有K个环 最后得到n个环 一次操作多一个环 要操作n-k次。
欧了。

NB!

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10010;
int b[N];
bool vis[N];
int n;
int main()
{cin>>n;for(int i=1;i<=n;i++) scanf("%d",&b[i]);int cnt = 0;    //统计环的数量for(int i=1;i<=n;i++){if(!vis[i]){for(int j=i;!vis[j];j = b[j]) //!vis[j] 就行 如果是环 就会回到最初的起点 起点已经vis过了vis[j] = 1;cnt++;}}printf("%d ",n-cnt);
}

1224. 交换瓶子相关推荐

  1. 怎么将Java中的小瓶子删掉_AcWing 1224. 交换瓶子 JAVA O(n)

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

  2. 1720: 交换瓶子

    1720: 交换瓶子 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. 【Code Pratice】—— 猜字母、次数差、交换瓶子

    文章目录 1 | 猜字母 题目 思路 逻辑代码 2 | 次数差 题目 思路 逻辑代码 3 | 交换瓶子 题目 思路 逻辑代码 1 | 猜字母 题目 把abcd-s共19个字母组成的序列重复拼接106次 ...

最新文章

  1. 联通短信网关返回90状态的解决
  2. MongodDB数据库安装和简单使用
  3. Kotlin-Learning 扩展
  4. 面试官出的MySQL索引问题,这篇文章全给你解决!
  5. Java Hashtable rehash()方法与示例
  6. appnode php,环境软件路径参考
  7. Android MVP+Retrofit(封装)+RxJava实例
  8. 2台主机极致实现双主复制架构及MMM
  9. Windows2000 VMware Tools KB835732 补丁包
  10. 基于Python实现socket远程木马
  11. 存货的三个加权平均单价
  12. Halcon视觉实战例程之汉字识别
  13. ftp上传工具,八款最佳的ftp上传下载工具,支持中文(ftp客户端分享)
  14. 【数学】有理分式的拆解技巧
  15. 年金系数用计算机怎么算,年金系数是什么?怎么计算?
  16. 视频教程-软考系统集成项目管理工程师视频教程(上)-软考
  17. springboot疑难杂症
  18. DNS系统SRV和NAPTR记录类型说明
  19. vue3 实现一个简易版日历
  20. 关于uxtheme.dll为无效的windows映像的问题

热门文章

  1. 【ML】异常检测(anomaly detection)原理 + 实践 (基于sklearn)
  2. 计算机类国家网络安全学院,武汉大学国家网络安全学院
  3. 王慧文复出进军人工智能,王兴投资BlockCity区块城市搞元宇宙
  4. 不吃早餐/自噬效应/断食
  5. 基于DEM模拟淹没区域随时间推演算法代码展示
  6. VS2019配置libigl(吐血整理)
  7. 亚马逊CPC认证审核通不过什么是什么原因
  8. ctfshow web入门 78-88的文件包含
  9. 职场吐槽大会:一起聊聊职场里的奇葩人奇葩事
  10. Android闹钟服务AlarmManager