• hdu 3784 继续xxx定律


    当n为3时,我们在验证xxx定律的过程中会得到一个序列,3,5,8,4,2,1,将3称为关键数,5,8,4,2称为覆盖数。现在输入n个数字a[i],根据关键数与覆盖数的理论,我们只需要验证其中部分数就可以确定所有数满足xxx定律,输出输入的n个数中的关键数。如果其中有多个关键数的话按照其输入顺序的逆序输出。


     

    Input
    输入数据包含多个用例,每个用例首先包含一个整数n,然后接下来一行有n个整数a[i],其中:
    1<=n<=500
    1<a[i]<=1000


     

    Output
    请计算并输出数组a中包含的关键数,并按照其输入顺序的逆序输出,每个用例输出占一行。


     

    Sample Input
    3
    3 8 4
    5
    3 8 4 7 15
    5
    3 8 4 15 7
    0


     

    Sample Output
    3
    15 7 3
    7 15 3


     

    Source
     
    // 3n+1 问题
    // 这题目真是好难理解
    // 就是求序列中哪些数不会被覆盖

    #include <iostream>
    #include <cstdio>
    #include <string.h>
    using namespace
     std;
    bool
     h[200000];
    int
     main()
    {

         int
     n,m,i,k,a[503],b[503];
         while
    (scanf("%d",&n),n)
         {

            memset(h,0,sizeof(h));
            for
    (i=0;i<n;i++)
               scanf("%d",&b[i]);
           for
    (i=0;i<n;i++)  ///坑人呀,或许是我想的不周全,理解不到位
          {

              m=b[i];
            while
    (m>1)
            {

                if
    (m%2)
                  m=(m*3+1)>>1;
                 else

                  m=m>>1;
                h[m]=1;
            }
          }

            for
    (k=i=0;i<n;i++)
            {

                  if
    (!h[b[i]])
                   a[k++]=b[i];
            }

            printf("%d",a[--k]);
            for
    (k--;k>=0;k--)
             printf(" %d",a[k]);
             printf("\n");
         }

            return
     0;
    }

                                                           -------江财小子

  • 相关阅读:
    原创 计算机系学生大学四年应该这样过
    ff3f34fq34f
    指针 引用
    POJ3352Road Construction
    POJ3308Paratroopers
    北大ACM试题分类 实时更新我所有的解题报告链接
    POJ2516Minimum Cost
    【转】一位ACMer过来人的心得
    POJ2528Mayor's posters
    POJ2186Popular Cows
  • 原文地址:https://www.cnblogs.com/372465774y/p/2421647.html
Copyright © 2020-2023  润新知