-
题目描述:
-
当n为3时,我们在验证xxx定律的过程中会得到一个序列,3,5,8,4,2,1,将3称为关键数,5,8,4,2称为覆盖数。现在输入n个数字a[i],根据关键数与覆盖数的理论,我们只需要验证其中部分数就可以确定所有数满足xxx定律,输出输入的n个数中的关键数。如果其中有多个关键数的话按照其输入顺序的逆序输出。
-
输入:
-
输入数据包含多个用例,每个用例首先包含一个整数n,然后接下来一行有n个整数a[i],其中: 1<=n<=500, 1<a[i]<=1000
-
输出:
-
请计算并输出数组a中包含的关键数,并按照其输入顺序的逆序输出,每个用例输出占一行。
-
样例输入:
-
3 3 8 4 5 3 8 4 7 15 5 3 8 4 15 7 0
-
样例输出:
-
3 15 7 3 7 15 3
理解错题意,真心烦- #include <iostream>
- #include <string>
- #include <algorithm>
- #include <memory.h>
- #include <cstdio>
- #include <cstdlib>
- #include <vector>
- using namespace std;
- int a[501];
- int b[1000000];
- int tmp;
- int n;
- void doit(int n){
- if(n==1)
- return ;
- if(n%2){
- tmp = (n*3+1)/2;
- }else{
- tmp = n/2;
- }
- b[tmp] = 0;
- doit(tmp);
- }
- int main(){
- //freopen("in.txt", "r", stdin);
- int t;
- while(cin>>n, n){
- memset(b, 0, sizeof(b));
- for(int i=0;i<n;++i){
- scanf("%d", &t);
- a[i] = t;
- b[t]++;
- }
- for(int i=0;i<n;i++){
- if(b[a[i]]!=0 && b[a[i]]!=-1){
- b[a[i]] = -1;
- doit(a[i]);
- }
- }
- b[1] = 0;
- bool init = true;
- for(int i=n-1;i>=0;i--){
- if(b[a[i]]==-1){
- if(init){
- init = false;
- printf("%d", a[i]);
- }else
- printf(" %d", a[i]);
- }
- }
- printf("\n");
- }
- //fclose(stdin);
- }