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