您的位置:首页 > 其它

hiho一下 第167周

2017-09-10 20:02 176 查看


题目1 : 数组重排

时间限制:10000ms
单点时限:1000ms
内存限制:256MB


描述

小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 。


输出

输出最少重排的次数。

样例输入
3
2 3 1


样例输出
3


可以找出每个数回到原位置的次数,然后求n个数回到原位置的最小公倍数时间O(n^2);

#include<iostream>
#include<string>
#include<cstring>
#include<stdio.h>
#include<vector>
#include <algorithm>
#include<math.h>
using namespace std;
int gb(int x,int y)
{
int a=x,b=y;
int c=a%b;
while(c!=0)
{
a=b;
b=c;
c=a%b;
}
return x/b*y;
}
int main()
{
int a[110]={0};
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int ss=1;
for(int i=1;i<=n;i++)
{
int s=1;
int t=a[i];
while(t!=i)//i回到原位置次数
{
t=a[t];
s++;
}
ss=gb(ss,s);
}
printf("%d\n",ss);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: