• PAT2021年春季考试甲级,题解


    仅提供个人思路~
     
    7-1 Arithmetic Progression of Primes (20 分)
    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN = 1e5+1;
    int prime[MAXN],len=0;
    //把素数打出来会快一点 
    void init()
    {
        for(int i=2;i<=MAXN;i++)
        {
            int flag=0;
            for(int j=2;j*j<=i;j++)
            {
                if(i%j==0)
                {
                    flag=1;
                    break;
                }
            }
            if(flag==0)prime[i]=1; 
        }
    }
    
    bool check(int first,int d_value, int n,int maxp)
    {
        for(int i=first;n>0;i+=d_value,n-=1)
        {
            if(i>maxp)return false;
            if(!prime[i])return false;
        }
        return true;
    }
    
    void print(int first,int d_value, int n)
    {
        for(int i=first;n>0;i+=d_value,n-=1)
        {
            if(i==first)cout<<i;
            else cout<<" "<<i;
        }
        cout<<endl;
    }
    
    int main(){
        int n,maxp;
        cin>>n>>maxp;
        init();
        //i是两数之间差值
        if(n!=1)
        {
            for(int i=maxp/(n-1);i>=1;i--)
            {
                //j是首个数的位置 
                for(int j=maxp-(n-1)*i;j>=2;j--)
                {
                    if(check(j,i,n,maxp))
                    {
                        print(j,i,n);
                        return 0;
                    }
                }
                
            }
        }
        for(int i=maxp;i>1;i--)
        {
            if(prime[i])
            {
                cout<<i<<endl;
                return 0;
            }
        }
        return 0;
    }
    View Code

    7-2 Lab Access Scheduling (25 分)

    #include<bits/stdc++.h>
    using namespace std;
    struct person
    {
        int start,end;
    }p[2050];
    //按照走的时间升序 
    bool cmp(struct person a,struct person b)
    {        
        if(a.end==b.end)return a.start>b.start;//这里大于小于都能过测试, 
        else return a.end<b.end;
    } 
    int main()
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            int h,m,s;
            scanf("%d:%d:%d",&h,&m,&s);
            p[i].start=h*3600+m*60+s;
            scanf("%d:%d:%d",&h,&m,&s);
            p[i].end=h*3600+m*60+s;
            //cout<<h<<" "<<m<<" "<<s<<endl;
        }
        sort(p,p+n,cmp);
        int start=0,end=0,ans=0;
        for(int i=0;i<n;i++)
        {
            //cout<<p[i].start<<" "<<p[i].end<<endl;
            if(p[i].start>=end)
            {
                end=p[i].end;
                ans++;
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    View Code

    7-3 Structure of Max-Heap (25 分)

    #include<bits/stdc++.h>
    using namespace std;
    //tree开大一点不然tree[i*2+1]爆了 
    int n,m,tree[2050]={0};
    bool sub(int a,int b)
    {
        for(int i=1;i+1<=n;i++)
        {
            if(tree[i]==a&&tree[i+1]==b&&i/2==(i+1)/2)
            {
                return true;
            }
        }
        return false;
    }
    bool parent(int a,int b)
    {
        for(int i=1;i<=n;i++)
        {
            if(tree[i]==a&&tree[i*2]==b&&i*2<=n||tree[i]==a&&tree[i*2+1]==b&&i*2+1<=n)
            {
                return true;
            }
        }
        return false;
    }
    bool left(int a,int b)
    {
        for(int i=1;i<=n;i++)
        {
            if(tree[i]==b&&tree[i*2]==a&&i*2<=n)
            {
                return true;
            }
        }
        return false;
    }
    bool right(int a,int b)
    {
        for(int i=1;i<=n;i++)
        {
            if(tree[i]==b&&tree[i*2+1]==a&&i*2+1<=n)
            {
                return true;
            }
        }
        return false;
    }
    int main()
    {    
        cin>>n>>m;
        int a[1050];
        for(int i=1;i<=n;i++)
        {
            cin>>tree[i];
            for(int j=i/2;j>=1;j--)
            {
                int p=j;
                if(tree[j*2]>tree[p]&&j*2<=i)p=j*2;
                if(tree[j*2+1]>tree[p]&&j*2+1<=i)p=j*2+1;
                swap(tree[j],tree[p]);
            }
        }
        int ans[50]={0};
        for(int i=0;i<m;i++)
        {
            int x,y;
            string s;
            cin>>x>>s;
            if(s=="and")
            {
                cin>>y>>s>>s;
                if(sub(x,y)||sub(y,x))ans[i]=1;
                continue;
            }
            cin>>s>>s;
            if(s=="root")
            {
                if(tree[1]==x)ans[i]=1;
            }
            if(s=="parent")
            {
                cin>>s>>y;
                if(parent(x,y))ans[i]=1;
            }
            if(s=="left")
            {
                cin>>s>>s>>y;
                if(left(x,y))ans[i]=1;
            }
            if(s=="right")
            {
                cin>>s>>s>>y;
                if(right(x,y))ans[i]=1;
            }
        }
        
        for(int i=0;i<m;i++)cout<<ans[i];
        cout<<endl;
        return 0;
    }
    View Code

    STL可以之间make_heap,但是建堆的过程需要了解

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n,m;
        string r="";
        cin>>n>>m;
        int a[n];
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            make_heap(a,a+i+1);
        }
        while(m--)
        {
            int x,y;string s;
            cin>>x>>s;
            if(s=="and")
            {
                cin>>y>>s>>s;
                int i;
                for(i=0;i<n;i++)
                {
                    if(a[i]==x)break;
                }
                if(i+1<n&&a[i+1]==y&&i%2==1)r+="1";
                else if(i>0&&i<n&&a[i-1]==y&&i%2==0)r+="1";
                else r+="0";
            }
            else
            {
                cin>>s>>s;
                if(s=="root")
                {
                    if(a[0]==x)r+="1";
                    else r+="0";
                }
                if(s=="parent")
                {
                    cin>>s>>y;
                    int i;
                    for(i=0;i<n;i++)
                    {
                        if(a[i]==y)break;
                    }
                    if(i!=0&&i<n&&a[(i-1)/2]==x)r+="1";
                    else r+="0";
                }
                if(s=="right")
                {
                    cin>>s>>s>>y;
                    int i;
                    for(i=0;i<n;i++)
                    {
                        if(a[i]==y)break;
                    }
                    if(i*2+2<n&&a[i*2+2]==x)r+="1";
                    else r+="0";
                }
                if(s=="left")
                {
                    cin>>s>>s>>y;
                    int i;
                    for(i=0;i<n;i++)
                    {
                        if(a[i]==y)break;
                    }
                    if(i*2+1<n&&a[i*2+1]==x)r+="1";
                    else r+="0";
                }
            }
        }
        cout<<r;
    } 
    View Code

    7-4 Recycling of Shared Bicycles (30 分)

    #include<bits/stdc++.h>
    using namespace std;
    const int INF = 0x3f3f;
    int e[250][250];
    int vis[250],n,m,ans=0,cnt=0;
    void dfs(int cur)
    {
        vis[cur]=1;
        int nex=-1;
        for(int i=0;i<=n;i++)
        {
            //注意条件 
            if(!vis[i]&&i!=cur&&e[cur][i]!=INF)
            {
                if(nex==-1||e[cur][i]<e[cur][nex])
                nex=i;
            }
        }
    
        if(cur!=0)cout<<" "<<cur;
        else cout<<cur;
        ans+=e[cur][nex],cnt++;
        if(nex!=-1)    dfs(nex);
    }
    int main()
    {
        cin>>n>>m;
        //init 
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=n;j++)
            {
                if(i==j)e[i][j]=0;
                else e[i][j]=INF;
            }
        }  
        for(int i=0;i<m;i++)
        {
            int s1,s2,dist;
            cin>>s1>>s2>>dist;
            e[s1][s2]=e[s2][s1]=dist;
        }
        //floyd算所有点距离 
        for(int k=0;k<=n;k++)
        {
            for(int i=0;i<=n;i++)
            {
                for(int j=0;j<=n;j++)
                {
                    if(e[i][j]>e[i][k]+e[k][j])
                    {
                        e[i][j]=e[i][k]+e[k][j];  
                    }
                }
            }
        }
        dfs(0);
        cout<<endl;
        if(cnt==n+1) cout<<ans<<endl;
        else 
        {
            int first=0;
            for(int i=0;i<=n;i++)
            {
                if(!vis[i])
                {
                    if(!first)cout<<i,first=1;
                    else cout<<" "<<i;
                }
            }
            cout<<endl;
        }
        return 0;
    } 
    View Code
  • 相关阅读:
    golang不想http自动处理重定向的解决方案
    学习WebDav
    keepass+坚果云管理我的密码
    定制右键功能,看这一篇就够了
    翻转二叉树
    加密sqlite3数据库文件
    算出cron表达式接下来几次执行时间
    关于斐波那契数列的3种解法
    golang通过cgo调用lua
    学习go语言并完成第一个作品
  • 原文地址:https://www.cnblogs.com/myrtle/p/15979804.html
Copyright © 2020-2023  润新知