PAT甲级2019春季考试题解

7-1 Sexy Primes

按题意来就可以了,出的水了~

#include<bits/stdc++.h>
using namespace std;
const int maxn=1014;
int isprime (int n) {
    if (n<=1) return 0;
    if (n==2) return 1;
    if (n%2==0) return 0;
    for (int i=3;i<=(int)sqrt(n);i++)
    if (n%i==0) return 0;
    return 1;
}
int judge (int n) {
    if (isprime(n)&&isprime(n+6)&&isprime(n-6)) return 3;
    else if (isprime(n)&&isprime(n+6)) return 1;
    else if (isprime(n)&&isprime(n-6)) return 2;
    return 0;
}
int main () {
    int N;
    scanf ("%d",&N);
    if (judge(N)==3) {
        printf ("Yes\n");
        printf ("%d",N-6);
    }
    else if (judge(N)==1) {
        printf ("Yes\n");
        printf ("%d",N+6);
    }
    else if (judge(N)==2) {
        printf ("Yes\n");
        printf ("%d",N-6);
    }
    else {
        printf ("No\n");
        for (int i=N+1;;i++) {
            if (judge(i)==1||judge(i)==2||judge(i)==3) {
                printf ("%d",i);
                return 0;
            }
        }
    }
} 

7-2 Anniversary

map存字符串,substr判断信息~

#include<bits/stdc++.h>
using namespace std;
const int maxn=1014;
int main () {
    unordered_map<string,int> mp1;
    int N;
    scanf ("%d",&N);
    string s,olds1="372928300006118710",olds2="372928300006118710";
    for (int i=0;i<N;i++) {
        cin>>s;
        mp1[s]=1;
    }
    int M,cnt=0;
    scanf ("%d",&M);
    for (int i=0;i<M;i++) {
        cin>>s;
        if (mp1[s]==1) {
            cnt++;
            if (s.substr(6,7)<olds1.substr(6,7)) 
            olds1=s;
        }
        if (s.substr(6,7)<olds2.substr(6,7)) 
        olds2=s;
    }
    printf ("%d\n",cnt);
    if (cnt==0) cout<<olds2;
    else cout<<olds1;
    return 0;
} 

7-3 Telefraud Detection

复杂一点的并查集~

#include<bits/stdc++.h>
using namespace std;
const int maxn=1014;
int father[maxn],g[maxn][maxn];
void init () {
    for (int i=1;i<maxn;i++)
    father[i]=i;
}
int findfather (int x) {
    int a=x;
    while (x!=father[x])
    x=father[x];
    while (a!=father[a]) {
        int z=a;
        a=father[a];
        father[z]=x;
    }
    return x;
}
void Union (int a,int b) {
    int faA=findfather(a);
    int faB=findfather(b);
    if (faA!=faB) father[faA]=faB;
}
struct gang {
    vector<int> number;
}Gang[maxn];
bool cmp (gang a,gang b) {
    return a.number[0]<b.number[0];
}
int main () {
    int K,N,M;
    scanf ("%d %d %d",&K,&N,&M);
    int u,v,x;
    for (int i=0;i<M;i++) {
        scanf ("%d %d",&u,&v);
        scanf ("%d",&x);
        g[u][v]+=x;
    }
    vector<int> susp;
    for (int i=1;i<=N;i++) {
        int out=0,in=0;
        for (int j=1;j<=N;j++) {
            if (j!=i&&g[i][j]<=5&&g[i][j]!=0) out++;
            if (j!=i&&g[i][j]<=5&&g[i][j]!=0&&g[j][i]!=0) in++;
        }
        if (double(in*1.0/out)<=0.20&&out>K) susp.push_back(i);
    }
    init ();
    for (int i=0;i<susp.size();i++)
    for (int j=i+1;j<susp.size();j++)
    if (g[susp[i]][susp[j]]!=0&&g[susp[j]][susp[i]]!=0) 
    Union (susp[i],susp[j]);
    for (int i=0;i<susp.size();i++)
    Gang[findfather(susp[i])].number.push_back(susp[i]);
    //sort (Gang,Gang+maxn,cmp);
    int ans=0;
    vector<gang> adj;
    for (int i=1;i<=N;i++) {
        if (Gang[i].number.size()!=0) {
            ans++;
            sort (Gang[i].number.begin(),Gang[i].number.end());
            adj.push_back(Gang[i]);
        }
    }
    sort (adj.begin(),adj.end(),cmp);
    if (ans==0) printf ("None");
    for (int i=0;i<ans;i++) {
        for (int j=0;j<adj[i].number.size();j++) {
            if (j!=0) printf (" ");
            printf ("%d",adj[i].number[j]);
        }
        printf ("\n");
    }
    return 0;
}

7-4 Structure of a Binary Tree

大模拟题~

#include<bits/stdc++.h>
using namespace std;
const int maxn=1014;
struct node {
    int data;
    node * left;
    node * right;    
};
int post[maxn],in[maxn];
node * create (int postL,int postR,int inL,int inR) {
    if (postL>postR) return NULL;
    node * root=new node;
    root->data=post[postR];
    int k;
    for (k=inL;k<=inR;k++)
    if (in[k]==root->data) break;
    int numLeft=k-inL;
    root->left=create (postL,postL+numLeft-1,inL,k-1);
    root->right=create (postL+numLeft,postR-1,k+1,inR);
    return root;
}
int depth[maxn],isFull=1,maxdepth=-1;
unordered_map<int,int> bro,l,r,father;
void bfs (node * root) {
    queue<node *> q;
    q.push(root);
    depth[root->data]=0;
    //maxdepth=max (depth[root->data],maxdepth);
    while (!q.empty()) {
        node * now=q.front();
        q.pop();
        //if (!now->left||!now->right) isFull=0;
        if ((!now->left&&now->right)||(now->left&&!now->right)) isFull=0;
        if (now->left&&now->right) {
            bro[now->left->data]=now->right->data;
            bro[now->right->data]=now->left->data;
        }
        if (now->left) {
            q.push(now->left);
            depth[now->left->data]=depth[now->data]+1;
            //maxdepth=max (depth[now->left->data],maxdepth);
            l[now->data]=now->left->data;
            father[now->left->data]=now->data;
        }
        if (now->right) {
            q.push(now->right);
            depth[now->right->data]=depth[now->data]+1;
            r[now->data]=now->right->data;
            father[now->right->data]=now->data;
            //maxdepth=max (depth[now->right->data],maxdepth);
        }
    }
}
int main () {
    int N;
    scanf ("%d",&N);
    for (int i=0;i<N;i++)
    scanf ("%d",&post[i]);
    for (int i=0;i<N;i++)
    scanf ("%d",&in[i]);
    node * root=create (0,N-1,0,N-1);
    bfs (root);
    //if (N<pow(2,maxdepth)-1) isFull=0;
    int q;
    scanf ("%d",&q);
    string s;
    getchar ();
    for (int i=0;i<q;i++) {
        getline (cin,s);
        //cout<<s.substr(s.length()-1-4,4)<<endl;
        if (s.substr(s.length()-4,4)=="root") {
            int rootnum=0;
            for (int j=0;j<s.length();j++) {
                if (s[j]>='0'&&s[j]<='9') rootnum=rootnum*10+s[j]-'0';
                else break;
            }
            if (root->data==rootnum) printf ("Yes\n");
            else printf ("No\n");
        }
        else if (s.substr(s.length()-8,8)=="siblings") {
            int num[2]={0},cnt=0;
            for (int j=0;j<s.length();j++) {
                if (s[j]>='0'&&s[j]<='9') num[cnt]=num[cnt]*10+s[j]-'0';
                else if (s[j-1]>='0'&&s[j-1]<='9') cnt++;
            }
            if (bro[num[0]]==num[1]) printf ("Yes\n");
            else printf ("No\n");
        }
        else if (s.substr(s.length()-4,4)=="tree") {
            if (isFull==1) printf ("Yes\n");
            else printf ("No\n");
        }
        else if (s.substr(s.length()-5,5)=="level") {
            int num[2]={0},cnt=0;
            for (int j=0;j<s.length();j++) {
                if (s[j]>='0'&&s[j]<='9') num[cnt]=num[cnt]*10+s[j]-'0';
                else if (s[j-1]>='0'&&s[j-1]<='9') cnt++;
            }
            if (depth[num[0]]==depth[num[1]]) printf ("Yes\n");
            else printf ("No\n");
        }
        else if (s.find("left")!=string::npos) {
            int num[2]={0},cnt=0;
            for (int j=0;j<s.length();j++) {
                if (s[j]>='0'&&s[j]<='9') num[cnt]=num[cnt]*10+s[j]-'0';
                else if (s[j-1]>='0'&&s[j-1]<='9') cnt++;
            }
            if (l[num[1]]==num[0]) printf ("Yes\n");
            else printf ("No\n");
        }
        else if (s.find("right")!=string::npos) {
            int num[2]={0},cnt=0;
            for (int j=0;j<s.length();j++) {
                if (s[j]>='0'&&s[j]<='9') num[cnt]=num[cnt]*10+s[j]-'0';
                else if (s[j-1]>='0'&&s[j-1]<='9') cnt++;
            }
            if (r[num[1]]==num[0]) printf ("Yes\n");
            else printf ("No\n");
        }
        else if (s.find("parent")!=string::npos) {
            int num[2]={0},cnt=0;
            for (int j=0;j<s.length();j++) {
                if (s[j]>='0'&&s[j]<='9') num[cnt]=num[cnt]*10+s[j]-'0';
                else if (s[j-1]>='0'&&s[j-1]<='9') cnt++;
            }
            if (father[num[1]]==num[0]) printf ("Yes\n");
            else printf ("No\n");
        }
    }
    return 0;
}

 

posted @ 2020-02-16 17:54  zlc0405  阅读(291)  评论(0编辑  收藏  举报