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; }