PAT乙级1005继续(3n+1)猜想 测试点3总是通不过



int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    int max=a[0];
    for(int i=1;i<n;i++)
    {
        if(max<a[i])
        max=a[i];
    }
    int b[max];
    for(int i=0;i<max+1;i++)
    {
        b[i]=1;
    }
    for(int i=0;i<n;i++)
    {
        int m=a[i];
        while(m!=1)
        {
            if(m%2==0)
            {
                m=m/2;
                if(m<=max)  b[m]=0;
            }
            else 
            {
                m=3*m+1;
                m=m/2;
                if(m<=max)b[m]=0;
            }
        }
    }

    int t=0;
    for(int i=0;i<n;i++)
    {
        if(b[a[i]]==0)a[i]=-1;
        else t++;
    }
    int mn,j,p,w=1;
    for(int i=0;i<t;i++)
    {
         mn=a[0];

        for( j=1;j<n;j++)
        {
            if(a[j]>mn)
            {
            mn=a[j];
            p=j;}
        }
        if(w==1)
        {
            printf("%d",mn);
            w=0;
        }
        else printf(" %d",mn);

        a[p]=-1;
    }
    printf("\n");
    return 0;
}

https://blog.csdn.net/weixin_38663654/article/details/102692140

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(int a,int b) {
    return a>b;
}
int main() {
    vector<int> a(101,0);
    int n;
    cin>>n;
    vector<int> arr(n);
    for(int i=0; i<n; i++) {
        int p;
        cin>>p;
        arr[i]=p;
        if(!a[p])
            while(p!=1) {
                int q;
                if(p%2)
                    q=(3*p+1)/2;
                else
                    q=p/2;
                if(q<=100){
                    if(a[q])
                        break;
                    a[q]=1;
                }
                p=q;
            }
    }
    vector<int> A;
    for(int i=0; i<n; i++)
        if(!a[arr[i]])
            A.push_back(arr[i]);
    sort(A.begin(),A.end(),cmp);
    for(int i=0; i<A.size(); i++)
        cout<<A[i]<<(i!=A.size()-1?" ":"");
    return 0;
}