标签:can while for post 题目 lcm memset ati ref
题目链接:
http://poj.org/problem?id=2369
题目大意:
给定一个序列。问最少须要多少次置换才干变为 1、2、…、N 的有序序列。比方说给
定5个数的序列 4 1 5 2 3。表示置换为:
( 1 2 3 4 5 ) ,即 (1 4 2)(3 5)
4 1 5 2 3
解题思路:
对于每一位找到自己轮换内轮换到自己的次数。求不相交的轮换之间的次数的公倍数,
即为终于结果。
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; int GCD(int a,int b) { if(b == 0) return a; return GCD(b,a%b); } int LCM(int a,int b) { return a / GCD(a,b) * b; } int A[1100],vis[1100];//vis[]标记轮换 int main() { int N; while(~scanf("%d",&N)) { memset(vis,0,sizeof(vis)); for(int i = 1; i <= N; ++i) scanf("%d",&A[i]); int Ans = 1; for(int i = 1; i <= N; ++i) { int tmp = A[i]; int Num = 1; vis[i] = 1; while(tmp != i && !vis[tmp]) { vis[tmp] = 1; tmp = A[tmp]; Num++; } Ans = LCM(Ans,Num); } printf("%d\n",Ans); } return 0; }
标签:can while for post 题目 lcm memset ati ref
原文地址:http://www.cnblogs.com/mthoutai/p/6992243.html