hdu-oj 3784 继续xxx定律

继续xxx定律

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2296    Accepted Submission(s): 650

Problem Description
当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
题目大意:这题是接上上面的那个XXX定律那题的。。 http://acm.hdu.edu.cn/showproblem.php?pid=3782 用XXX定律 比如说3-5-8-4-2-1。。这是演化过程。。 也就是3是 关键数,5 8 4 2 都是3演化出来的,所以是覆盖数。。 这题就是给你一串数,求出其中的关键数, 就是不能通过其他数 演化而成的。。。。
附代码;
#include <stdio.h>
#include <string.h>
int a[505];
int c[130000];
int main()
{   int n,m,i,j,k;
    while(scanf("%d",&n),n){
       memset(c,0,sizeof(c));
       for(i=0;i<n;i++)
          scanf("%d",&a[i]);
       for(i=0;i<n;i++){
          m=a[i];
          if(!c[m]){
            while(m!=1){
              if(m%2==0){
                 m/=2;
                 c[m]=1;
              }
              else{
                m=3*m+1;
                m/=2;
                c[m]=1;
              }
            }
          }
       }
       for(i=n-1;i>=0;i--)
         if(!c[a[i]])
           {printf("%d",a[i]);
           break;} 
       for(j=i-1;j>=0;j--)
          if(!c[a[j]])
            printf(" %d",a[j]);
       printf("\n");
    }
    return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值