PAT-2021年春季考试-甲级,题解

仅提供个人思路~
 
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

 

 

posted @ 2022-03-08 11:47  myrtle  阅读(80)  评论(0编辑  收藏  举报