hihocoder1330 数组重排
Posted 2855669158
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hihocoder1330 数组重排相关的知识,希望对你有一定的参考价值。
题意:一个数组,每次把i位置的数移到pi位置,问要几次可以将数组重新排列回来
题解:计算每个数的周期,所有数的周期的lcm就是答案,复杂度O(n*n),一个循环里面的数周期都是一样的,标记一下,复杂度o(n)
#include <bits/stdc++.h> #define maxn 110 #define ll long long using namespace std; ll a[maxn], dir[maxn]; map<ll,ll>mp; int main(){ ll n, t, num=0, ans=1; scanf("%lld", &n); for(ll i=1;i<=n;i++) scanf("%lld", &a[i]); for(ll i=1;i<=n;i++){ num = 0;t = a[i]; if(dir[t] == 1) continue; mp.clear(); while(!mp[t]){ mp[t] = 1; t = a[t]; dir[t] = 1; num++; } ans = ans*num/__gcd(ans, num); } printf("%lld\n", ans); return 0; }
以上是关于hihocoder1330 数组重排的主要内容,如果未能解决你的问题,请参考以下文章
NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段