zoukankan      html  css  js  c++  java
  • poj 1721 CARDS (置换群)

    题意:给你一个数列,第i号位置的数位a[i],现在将数列进行交换,交换规则为a[i]=a[a[i]];已知交换s次之后的序列,求原先序列

    思路:置换的问题必然存在一个循环节,使一个数列交换n次回到原来的数列上,我们只需要模拟交换找到循环节长度len,将已知的交换后的序列,则再进行 (len - s%len) 次交换即可得到原序列

    代码:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #define maxn 1000
    using namespace std;
    
    int main(int argc, char const *argv[])
    {
    
        int data[maxn];
        int a[maxn],b[maxn],c[maxn];
        int n,s;
        while(cin>>n>>s)
        {
          for(int i=1;i<=n;i++)
          {
              cin>>data[i];
              a[i]=b[i]=c[i]=data[i];
          }
          int len = 0;
          int o=3;
          while(1)
          {
             for(int i=1;i<=n;i++)
             a[i]=b[a[i]];
             for(int i=1;i<=n;i++)
             b[i]=a[i];
             int k=1;
             len++;
             for(int i=1;i<=n;i++)
             if(a[i]==data[i]) k++;
             if(k==n+1) break;
          }
          len = len - s%len;
          for(int j=1;j<=len;j++)
          {
             for(int i=1;i<=n;i++)
             data[i]=c[data[i]];
             for(int i=1;i<=n;i++)
             c[i]=data[i];
          }
          for(int i=1;i<=n;i++)
          cout<<data[i]<<endl;
        }
        return 0;
    }
  • 相关阅读:
    BOM:浏览器对象模型
    webStorm 用git上传代码(github)
    flex弹性布局
    面试题(一)
    HTTP协议···(一)
    构造函数
    断点调试
    FCC 高级算法题 库存更新
    FCC 高级算法题 收银机找零钱
    FCC 高级算法题 对称差分
  • 原文地址:https://www.cnblogs.com/simplekinght/p/6645705.html
Copyright © 2011-2022 走看看