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
题解:
不难看出,任意一个数,它经过有限步数就可以回到原来位置;
那么,我们根据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 ...
随机推荐
- PHP 免费获取手机号码归属地
一.淘宝网API API地址: http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443 参数: tel:手机号码 返回 ...
- Kafka manager安装 (支持0.10以后版本consumer)
下载地址: https://pan.baidu.com/s/1jIE3YL4 步骤: 1. 解压kafka-manager-1.3.2.1.zip 2. cd kafka-manager-1.3.2 ...
- [原]如何为SqlServer2008数据库分配用户
前言: 当一个项目完成后,为了数据安全,总会对该项目的数据库分配一个用户,应该说总会创建一个用户来管理这个数据库,并且这个用户只能管理这个数据库.搞了好多次,每次都忘记怎么设置,所以写一篇博文记录一下 ...
- (iOS)判断GPS坐标是否在中国
博文转载至 http://blog.csdn.net/cuibo1123/article/details/45691631 火星坐标经纬度范围 由于火星坐标问题,所以需要判断一下经纬度是否在中国. 基 ...
- 《C++ Primer Plus》第17章 输入、输出和文件 学习笔记
流是进出程序的字节流.缓冲区是内存中的临时存储区域,是程序与文件或其他I/O设备之间的桥梁.信息在缓冲区和文件之间传输时,将使用设备(如磁盘驱动器)处理效率最高的尺寸以大块数据的方式进行传输.信息在缓 ...
- JDBC批量加密数据库密码
package com.lxc.wmb; import java.io.UnsupportedEncodingException; import java.security.MessageDigest ...
- spring mvc 篇
[1]spring mvc 实现多文件上传 http://blog.csdn.net/a1314517love/article/details/24183273 http://bbs.csdn.net ...
- C++播放wav音乐和音效
1. #include <mmsystem.h>#pragma comment(lib,"winmm.lib")PlaySound(TEXT("c:\\te ...
- MongoDB开篇
1.安装MongoDB 官方下载地址 https://www.mongodb.com/download-center#community 这个文件下载的有些奇怪,这个zip的文件下载下来和百度出来 ...
- 清空Cookie
function delCookie() { ; i < cookies.length; i++) { try { document.cookie = cookies[i] + "=0 ...