攀拓(PAT)- 程序设计(甲级)2024年春季考试仿真卷cpp题解

攀拓(PAT)- 程序设计(甲级)2024年春季考试仿真卷cpp题解


A-1 Braille Recognition

#include<iostream>
using namespace std;
const int N=110;
int n,m;
char g[N][N];
int sum[10];
void check(int i,int j){
    int cnt=0;
    for(int x=i;x<i+3;x++)
        for(int y=j;y<j+2;y++)
            if(g[x][y]=='*') cnt++;
    if(cnt==1&&g[i][j]=='*') sum[1]++;
    else if(cnt==2){
        if(g[i][j]=='*'){
            if(g[i+1][j]=='*') sum[2]++;
            else if(g[i][j+1]=='*') sum[3]++;
            else if(g[i+1][j+1]=='*') sum[5]++;
        }else if(g[i+1][j]=='*'&&g[i][j+1]=='*') sum[9]++;
    }else if(cnt==3){
        if(g[i][j]=='*'){
            if(g[i][j+1]=='*'&&g[i+1][j+1]=='*') sum[4]++;
            else if(g[i+1][j]=='*'&&g[i+1][j+1]=='*') sum[8]++;
            else if(g[i+1][j]=='*'&&g[i][j+1]=='*') sum[6]++;
        }else if(g[i+1][j]=='*'&&g[i+1][j+1]=='*'&&g[i][j+1]=='*') sum[0]++;
    }else if(cnt==4&&g[i+2][j]=='.'&&g[i+2][j+1]=='.') sum[7]++;
}
int main(){
    cin>>n>>m;
    getchar();
    for(int i=0;i<n;i++) cin>>g[i];
    for(int i=0;i+2<n;i++)
        for(int j=0;j+1<m;j++) {
            check(i,j);
        }
    for(int i=1;i<10;i++) printf("%d ",sum[i]);
    printf("%d",sum[0]);
    return 0;
}

A-2 AI Comments

#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_map>
using namespace std;
const int N=1e5+10;
struct a{
    int n,v;
    bool operator< (const a& t) const {
        if(n<0&&t.n<0){
            if(v!=t.v) return v>t.v;
            return n>t.n;
        }else if(n>=0&&t.n>=0){
            if(v!=t.v) return v>t.v;
            return n<t.n;
        }else return n>t.n;
    }
}res[5];
unordered_map<string,int> name;
int persons[N][5];
int a[N],mid[5];
int n,m;
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        string id;
        cin>>id;
        name[id]=i;
        for(int j=0;j<5;j++) scanf("%d",&persons[i][j]);
    }
    for(int i=0;i<5;i++){
        for(int j=0;j<n;j++) a[j]=persons[j][i];
        sort(a,a+n,greater<int>());
        if(n%2) mid[i]=a[n/2];
        else mid[i]=a[(n-1)/2];
    }
    while(m--){
        string id;
        cin>>id;
        if(name.find(id)!=name.end()){
            int i=name[id];
            for(int j=0;j<5;j++){
                int t=persons[i][j]-mid[j];
                if(t<0) res[j]={-(j+1),t};
                else res[j]={j+1,t};
            }
            sort(res,res+5);
            printf("%d",res[0].n);
            for(int j=1;j<5;j++) printf(" %d",res[j]);
            puts("");
        }else printf("Not Found\n");
    }
    return 0;
}

A-3 Degree of Skewness

#include<iostream>
#include<unordered_map>
using namespace std;
const int N=1e3+10;
int l[N],r[N],n,post[N],in[N];
unordered_map<int,int> pos;
int build(int il,int ir,int pl,int pr){
    int root=post[pr];
    int k=in[root];
    if(il<k) l[root]=build(il,k-1,pl,pl+k-1-il);
    if(k<ir) r[root]=build(k+1,ir,pl+k-il,pr-1);
    return 1;
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++) cin>>post[i];
    for(int i=0;i<n;i++){
        cin>>pos[i];
        in[pos[i]]=i;
    }
    build(0,n-1,0,n-1);
    int a=0,b=0;
    for(int i=1;i<=n;i++) {
        if(l[i]&&!r[i]) a++;
        else if(!l[i]&&r[i]) b++;
    }
    printf("%d = %d + %d\n",a-b,a,b);
    return 0;
}

A-4 Uniqueness of Topological Order

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=1e4+10;
bool g[N][N],st[N];
int n,m;
int sum[N],dist[N],cnt[N];

int main(){
    cin>>n>>m;
    memset(g,-1,sizeof g);
    int root=0;
    for(int i=0;i<m;i++){
        int a,b;
        cin>>a>>b;
        g[a][b]=true;
        sum[b]++;
    }
    int minv=1e4+10;
    for(int i=1;i<=n;i++) minv=min(minv,sum[i]);
    vector<int> fline;
    for(int i=1;i<=n;i++)
        if(sum[i]==minv) fline.push_back(i);
    cout<<fline[0];
    for(int i=1;i<fline.size();i++) cout<<' '<<fline[i];
    puts("");
    if(minv!=0||fline.size()>1){
        puts("N0");
        return 0;
    }
    int q[N];
    int hh=0,tt=0;
    q[0]=fline[0];
    while(hh<=tt){
        int t=q[hh++];
        for(int i=1;i<=n;i++){
            if(g[t][i]&&--sum[i]==0) q[++tt]=i;
        }
    }
    if(tt!=n-1) puts("No");
    else {
        cout<<"Yes"<<endl<<q[0];
        for(int i=0;i<n;i++) cout<<' '<<q[i];
    }
    return 0;
}
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值