zoukankan      html  css  js  c++  java
  • PAT甲级2019冬季考试题解

    A Good In C
    纯模拟题,用string数组读入数据,注意单词数量的判断

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1010;
    string a[27][8];
    int main () {
        for (int i=1;i<=26;i++) {
            for (int j=1;j<=7;j++)
            cin>>a[i][j];
        }
        string t;
        getchar ();
        getline (cin,t);
        string s[1050];
        int top=0;
        for (int i=0;i<t.length();i++) {
            if (t[i]>='A'&&t[i]<='Z') s[top]+=t[i];
            else if (t[i-1]>='A'&&t[i-1]<='Z') top++;
        }
        if (top!=0&&!(t[t.length()-1]>='A'&&t[t.length()-1]<='Z')) top--;
        for (int k=0;k<=top;k++) {
            for (int j=1;j<=7;j++) {
                for (int i=0;i<s[k].length();i++) {
                    if (i!=0) printf (" ");
                    cout<<a[s[k][i]-'A'+1][j];
                }
                cout<<endl;
            }
            //for (int j=1;j<=7;j++)
            if (k!=top) printf ("
    ");
        }
        //printf ("
    ");
        return 0;
    }

    B Block Reversing
    链表常规题,用结构体静态建立链表,有两个注意点:1、给出的结点里会有无关结点。2、链表里的元素个数能不能整除k要分开判断。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=100001;
    struct node {
        int address;
        int data;
        int next;
    }Node[maxn];
    int main () {
        int head,N,K;
        scanf ("%d %d %d",&head,&N,&K);
        int address,data,next;
        for (int i=0;i<N;i++) {
            scanf ("%05d %d %05d",&address,&data,&next);
            Node[address].address=address;
            Node[address].data=data;
            Node[address].next=next;
        }
        vector<node> vi;
        while (head!=-1) {
            vi.push_back(Node[head]);
            head=Node[head].next;
        }
        vector<int> vp[100];
        if (vi.size()%K!=0) {
            printf ("%05d %d ",vi[vi.size()/K*K].address,vi[vi.size()/K*K].data);
            for (int i=vi.size()/K*K+1;i<vi.size();i++)
            printf ("%05d
    %05d %d ",vi[i].address,vi[i].address,vi[i].data);
            for (int i=vi.size()/K;i>0;i--) {
                for (int j=(i-1)*K;j<i*K;j++)
                printf ("%05d
    %05d %d ",vi[j].address,vi[j].address,vi[j].data);
            }
            printf ("-1");
        }
        else {
            printf ("%05d %d ",vi[vi.size()-K].address,vi[vi.size()-K].data);
            for (int i=vi.size()/K;i>0;i--) {
                int flag=0;
                if (i==vi.size()/K) flag=1;
                for (int j=(i-1)*K+flag;j<i*K;j++)
                printf ("%05d
    %05d %d ",vi[j].address,vi[j].address,vi[j].data);
            }
            printf ("-1");
        }
        return 0;
    } 

    C Summit
    个人认为全场最简单的一题,也是第一道ac的题目,就是图论,根据题意暴力做即可~

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1010;
    const int inf=1e9;
    int g[maxn][maxn];
    int N,M,K,L,a[maxn];
    void init () {
        for (int i=1;i<=N;i++)
        for (int j=1;j<=N;j++)
        g[i][j]=inf; 
    }
    int main () {
        scanf ("%d %d",&N,&M);
        int u,v;
        init ();
        for (int i=0;i<M;i++) {
            scanf ("%d %d",&u,&v);
            g[u][v]=g[v][u]=1;
        }
        scanf ("%d",&K);
        for (int i=0;i<K;i++) {
            int flag1=1,flag2=0,hash1[maxn]={0};
            scanf ("%d",&L);
            for (int j=0;j<L;j++) {
                scanf ("%d",&a[j]);
                hash1[a[j]]=1;
            }
            for (int j=0;j<L;j++) {
                for (int k=j+1;k<L;k++) {
                    if (g[a[j]][a[k]]==inf) {
                        flag1=0;break;
                    }
                }
                if (flag1==0) break;
            }
            if (flag1==0) {
                printf ("Area %d needs help.
    ",i+1);
                continue;
            }
            int u;
            for (int j=1;j<=N;j++) {
                if (hash1[j]==0) {
                    int flag3=0;
                    for (int k=0;k<L;k++) 
                    if (g[a[k]][j]==inf) flag3++;
                    if (flag3==0) {
                        u=j;
                        flag2=1;
                        break;
                    }
                }
                if (flag2==1) break;
            }
            if (flag1==1&&flag2==1) {
                printf ("Area %d may invite more people, such as %d.
    ",i+1,u);
            }
            else if (flag1==1&&flag2==0) {
                printf ("Area %d is OK.
    ",i+1);
            }
        }
        return 0;
    }

    D Cartesian Tree
    一开始以为是堆的算法,写了很久,其实并不是。一颗树,结点数据符合小顶堆的规则,给出它的中序遍历,要求输出层序。解决方法是先找出给定序列里最小的点作为根结点,再以根节点为标志,找根节点左边和右边各自最小的结点,作为根节点的左右子树,递归处理。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1010;
    struct node {
        int data;
        node * left;
        node * right;
    };
    int a[maxn];
    node * create (int inL,int inR,int inRoot) {
        if (inRoot==1e9) return NULL;
        node * root=new node;
        root->data=a[inRoot];
        int inLeft=1e9,inRight=1e9;
        int min=1e9;
        for (int i=inL;i<inRoot;i++) {
            if (a[i]<min) {
                min=a[i];
                inLeft=i;
            }
        }
        root->left=create (inL,inRoot-1,inLeft);
        min=1e9;
        for (int i=inRoot+1;i<=inR;i++) {
            if (a[i]<min) {
                min=a[i];
                inRight=i;
            }
        }
        root->right=create (inRoot+1,inR,inRight);
        return root;
    }
    void bfs (node * root) {
        queue<node *> q;
        q.push(root);
        while (!q.empty()) {
            node * now=q.front();
            q.pop();
            if (now!=root) printf (" ");
            printf ("%d",now->data);
            if (now->left) q.push(now->left);
            if (now->right) q.push(now->right);
        } 
    }
    int main () {
        int N;
        scanf ("%d",&N);
        for (int i=1;i<=N;i++) {
            scanf ("%d",&a[i]);
        }
        int min=1e9,inRoot=-1;
        for (int i=1;i<=N;i++) {
            if (a[i]<min) {
                min=a[i];
                inRoot=i;
            }
        }
        //printf ("%d
    ",inRoot);
        node * root=create (1,N,inRoot);
        bfs (root);
        return 0;
    }
  • 相关阅读:
    JMM简述
    spring简读
    Linux常用命令
    基于java的八大排序实现
    数据库事务说明
    BIO、NIO、AIO区别与联系
    ThreadLocal 是什么?有哪些使用场景?
    ConcurrentHashMap 和 Hashtable 比较,为什么推荐使用ConcurrentHashMap?
    sychronized设计原理
    MySQL索引详解
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12301737.html
Copyright © 2011-2022 走看看