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