mthoutai

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目链接:

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;
}


posted on 2017-06-12 12:11  mthoutai  阅读(198)  评论(0编辑  收藏  举报