1224. 交换瓶子
1224. 交换瓶子
暴力解法:
题解
这种暴力解法长得很像选择排序。
选择排序是分为1 ~ i的有序区 i+1 ~ n的无序区。在无序区中找一个最小的,然后放入无序区的第一个位置。
这个题也是这样,分为1 ~ i的有序区和 i+1 ~ n的无序区。在无序区中找的是a[j] == i+1的,然后交换,这样a[i+1] 就 = i+1.
置换群解法:
- 一共有n个瓶子 最多交换n-1次
1 2 3 4 5
5 4 3 2 1要得到上面就需要交换4次
- 直接想比较难 转化为一个图论的题 一个瓶子为一个点。瓶子的编号连接到位置为该瓶子编号的点。这样连接起来必定是一个环。这样的一个环被称为一个置换。希望得到的最终的位置 是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. 交换瓶子相关推荐
- 怎么将Java中的小瓶子删掉_AcWing 1224. 交换瓶子 JAVA O(n)
有 N 个瓶子,编号 1∼N ,放在架子上. 比如有 5 个瓶子: 2 1 3 5 4 要求每次拿起 2 个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的 ...
- 1720: 交换瓶子
1720: 交换瓶子 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次 ...
- 交换瓶子(蓝桥杯入门)
交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的 ...
- java实现第七届蓝桥杯交换瓶子
交换瓶子 交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于 ...
- 交换瓶子(蓝桥杯真题)
交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的 ...
- 蓝桥杯-【交换瓶子】【2016年省赛B组题解】【C++】
2016年第七届蓝桥杯题目汇总 http://blog.csdn.net/qq_34202873/article/details/79646517 第九题: 交换瓶子 有N个瓶子,编号 1 ~ N,放 ...
- 蓝桥杯2016年C语言B组-交换瓶子
蓝桥杯2016年C语言B组 交换瓶子 代码 交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的 ...
- 蓝桥杯 交换瓶子 Java实现
交换瓶子 有N个瓶子,编号 1 ~ N,放在架子上. 比如有5个瓶子: 2 1 3 5 4 要求每次拿起2个瓶子,交换它们的位置. 经过若干次后,使得瓶子的序号为: 1 2 3 4 5 对于这么简单的 ...
- 【Code Pratice】—— 猜字母、次数差、交换瓶子
文章目录 1 | 猜字母 题目 思路 逻辑代码 2 | 次数差 题目 思路 逻辑代码 3 | 交换瓶子 题目 思路 逻辑代码 1 | 猜字母 题目 把abcd-s共19个字母组成的序列重复拼接106次 ...
最新文章
- 联通短信网关返回90状态的解决
- MongodDB数据库安装和简单使用
- Kotlin-Learning 扩展
- 面试官出的MySQL索引问题,这篇文章全给你解决!
- Java Hashtable rehash()方法与示例
- appnode php,环境软件路径参考
- Android MVP+Retrofit(封装)+RxJava实例
- 2台主机极致实现双主复制架构及MMM
- Windows2000 VMware Tools KB835732 补丁包
- 基于Python实现socket远程木马
- 存货的三个加权平均单价
- Halcon视觉实战例程之汉字识别
- ftp上传工具,八款最佳的ftp上传下载工具,支持中文(ftp客户端分享)
- 【数学】有理分式的拆解技巧
- 年金系数用计算机怎么算,年金系数是什么?怎么计算?
- 视频教程-软考系统集成项目管理工程师视频教程(上)-软考
- springboot疑难杂症
- DNS系统SRV和NAPTR记录类型说明
- vue3 实现一个简易版日历
- 关于uxtheme.dll为无效的windows映像的问题