[关闭]
@feiyangyang 2022-06-06T08:24:20.000000Z 字数 708 阅读 311

1127.换位置游戏 代码

代码


  1. #include<iostream>
  2. #include<stdio.h>
  3. using namespace std;
  4. int n,a[2001],l,ans,m,k,c[2001],x,y;
  5. bool b[2001],f[1001];
  6. int gcb(int a, int b)//最大公约数函数
  7. {
  8. int c = 0;
  9. while(c = a % b)
  10. {
  11. a = b;
  12. b = c;
  13. }
  14. return b;
  15. }
  16. int main()
  17. {
  18. freopen("move.in","r",stdin);
  19. freopen("move.out","w",stdout);
  20. cin>>n;
  21. m=n;
  22. for(int i=1;i<=n;i++)
  23. {
  24. cin>>a[i];
  25. if(a[i]==i)
  26. {
  27. b[i]=1;
  28. m--;
  29. }
  30. }
  31. if(m==0)//测试是否全部到位,减少时间复杂度
  32. {
  33. cout<<1;
  34. return 0;
  35. }
  36. for(int i=1;i<=n;i++)
  37. {
  38. if(b[i]!=1)
  39. {
  40. l=0;
  41. int k=i;
  42. while(1)
  43. {
  44. if(k==i && l==1)//l为标记
  45. {
  46. break;
  47. }
  48. else
  49. {
  50. l=1;
  51. }
  52. k=a[k];//进行模拟了
  53. ans++;//ans表示当前轮数
  54. }
  55. f[ans]=1;//作为最小公倍数的参数之一
  56. ans=0;
  57. l=0;
  58. }
  59. }
  60. for(int i=2;i<=1000;i++)//求最小公倍数,因为1与任何数的 最小公倍数 都为那个数,所以i=2
  61. {
  62. if(x==0)//选择第一个参数(初始化)
  63. {
  64. if(f[i]==1)
  65. {
  66. x=i;
  67. }
  68. }
  69. else
  70. {
  71. if(f[i]==1)//判断是否出现
  72. x=x*i/gcb(x,i);//求最小公倍数,关于为什么父题解在 最后一行 提到过
  73. }
  74. }
  75. cout<<x; //输出最小公倍数
  76. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注