hihocoder 1330 - 数组重排 - [hiho一下167周][最小公倍数]
题目链接:https://hihocoder.com/problemset/problem/1330
描述
小Hi想知道,如果他每次都按照一种固定的顺序重排数组,那么最少经过几次重排之后数组会恢复初始的顺序?
具体来讲,给定一个1 - N 的排列 P,小Hi每次重排都是把第 i 个元素放到第 Pi个位置上。例如对于 P = (2, 3, 1),假设初始数组是(1, 2, 3),重排一次之后变为(3, 1, 2),重排两次之后变为(2, 3, 1),重排三次之后变回(1, 2, 3)。
被排数组中的元素可以认为是两两不同的。
输入
第一行一个整数 N ,代表数组的长度。 (1 ≤ N ≤ 100)
第二行N个整数,代表1 - N 的一个排列 P 。
输出
输出最少重排的次数。
(PS.从实际提交的AC代码来看,似乎重排次数至少为1,即必须进行重排操作)
- 样例输入
-
- 3
- 2 3 1
- 3
- 样例输出
-
- 3
题解:
不难看出,任意一个数,它经过有限步数就可以回到原来位置;
那么,我们根据P=(2,3,1),那么初始数列第一位a[1],第一步操作后它会变到第二位,第二步操作后它会变到第三位,第三步操作后它又会变回第一位,即回到原位;
如果忽视实际意义上的操作,简单的从数字变换来讲,即1→2→3→1,三个箭头,代表操作了三步;
那么更加广泛的,例如P=(5,2,1,4,3,6),对于每一位有:
1→5→3→1(3步);
2→2(1步);
3→1→5→3(3步);
……
5→3→1→5(3步);
6→6(1步);
然后当时我做到这一步就猜想是不是枚举每一位要最少重排多少步能回到原位,取最大值即可;
不过显然有反例,例如P=(3,2,1,5,6,4),这样即:
1→3→1(2步);
2→2(1步);
3→1→3(2步);
4→5→6→4(3步);
5→6→4→5(3步);
6→4→5→6(3步);
这样到底要重排多少次才能让整个数列回到原来顺序呢,显然是lcm(2,1,2,3,3,3)=6,即每一位回到原点的最少步数的最小公倍数;
AC代码:
- #include<cstdio>
- int n,p[],ans=;
- int gcd(int m,int n){return n?gcd(n,m%n):m;}
- int lcm(int m,int n){return m/gcd(m,n)*n;}
- int main()
- {
- scanf("%d",&n);
- for(int i=;i<=n;i++) scanf("%d",&p[i]);
- for(int i=;i<=n;i++)
- {
- int now=p[i],cnt=;
- while()
- {
- if(now==i) break;
- else
- {
- now=p[now];
- cnt++;
- }
- }
- ans=lcm(ans,cnt);
- }
- printf("%d\n",ans);
- }
PS.虽然用了GCD,但我都不好意思放数论分类里,放其他分类里吧……
hihocoder 1330 - 数组重排 - [hiho一下167周][最小公倍数]的更多相关文章
- hihocoder 1523:数组重排2
题目链接 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个1-N的排列A1, A2, ... AN,每次操作小Hi可以选择一个数,把它放到数组的最左边. 请计算小 ...
- hihoCoder 1523 数组重排2 贪心
题意:给定一个1-N的排列A1, A2, - AN,每次操作小Hi可以选择一个数,把它放到数组的最左边. 请计算小Hi最少进行几次操作就能使得新数组是递增排列的. 思路:最后的序列是递增的,那么必定满 ...
- hihocoder 1331 - 扩展二进制数 - [hiho一下168周]
题目链接:http://hihocoder.com/problemset/problem/1331 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 我们都知道二进制数的每 ...
- hihocoder 1322 - 树结构判定 - [hiho一下161周][模板题/水题]
题目链接:http://hihocoder.com/problemset/problem/1322 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个包含 N 个顶 ...
- hihocoder 1523 数组重排2+思维
参考:http://blog.csdn.net/howardemily/article/details/74991367 题意:每次可以移动数组中的一个数到数组的最左边,问最少操作数,使得数列升序: ...
- hihocoder 1320 - 压缩字符串 - [hiho一下160周]
这道题目可以说是一道非常好非常一颗赛艇的DP题了. 需要注意的是,其中情形3),字符串必然能完全转化为 N(str)形式,如果有N(str1)M(str2)等等另外样式,应该首先使用拼接形式对其进行划 ...
- hiho一下123周 后缀数组四·重复旋律
后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...
- hiho一下122周 后缀数组三·重复旋律
后缀数组三·重复旋律3 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...
- hiho一下121周 后缀数组二·重复旋律2
后缀数组二·重复旋律2 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...
随机推荐
- Java实现文件批量重命名
Windows操作系统可以实现重命名文件操作,却不能实现批量重命名.本实例实现了批量重命名功能,可以将一个文件夹内同一类型的文件按照一定的规则批量重命名.用户可以给出重命名模板,程序可以根据模板对相应 ...
- 开启apache的server-status辅助分析工具
在Apache的调优过程中,可以通过查看Apache提供的server-status(状态报告)来验证当前所设置数值是否合理,在httpd.conf文件中做如下设置来打开: #加载mod_status ...
- SpringMVC由浅入深day02_7上传图片
7 上传图片 7.1 需求 在修改商品页面,添加上传商品图片功能. 7.2 springmvc中对多部件类型解析 在页面form中提交enctype="multipart/form-data ...
- CentOS 6.3 + Subversion + Usvn 搭建版本管理服务器
一. Subversion 简介 Subversion是一个自由,开源的版本控制系统.在Subversion管理下,文件和目录可以超越时空.Subversion将文件存放在中心版本库里.这个版本库很像 ...
- flexbox常用布局左右固定,中间自适应
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- weblogic12C出现“java.lang.ArrayIndexOutOfBoundsException: 48188”
最近将10G的一个项目转移到12C出现数组越界的问题: 解决办法: jaxen-1.1.1.jarxom-1.0.jaricu4j-2.6.1.jar 把项目中这三个jar包删除后就可以正常部署了 ...
- 关于 g++ 编译器
g++由自由软件基金发行,g++是基于类unix的c++编译器,通常在命令行运行.它一般附带于类Unix系统中,因此如果你正在运行Unix或Linux系统,它很可能已经存在于你的系统中.你可以对一个源 ...
- Elastic Search 5.4.3 java api 入门
首先介绍一点,es的版本从之前的2.x跳跃到5.x,很多插件要保持一致,不然会产生很多版本不兼容的问题. 首先看一个demo先熟悉一下, 具体代码在git服务器上: https://github.co ...
- 使用es6的蹦床函数解决递归造成的堆栈溢出
首先,我们先定义一个函数,使用递归的思想写求和的方法: function sum(x, y) { if (y > 0) { return sum(x + 1, y - 1); } else ...
- eclipse项目中.classpath文件详解
1 前言 在使用eclipse或者myeclipse进行java项目开发的时候,每个project(工程)下面都会有一个.classpath文件,那么这个文件究竟有什么作用? 2 作用 .classp ...