美文网首页
2018-03-27 PAT补题练习题

2018-03-27 PAT补题练习题

作者: _弓长_大人 | 来源:发表于2018-09-25 12:46 被阅读11次

    L2-004. 这是二叉搜索树吗?
    代码当然是越短越好了
    我的代码写的有点丑

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int num[1001];
    int ans[1001];
    int cn=0;
    int f=0;
    void dfs(int l,int r){
        if(l>r)
            return;
        if(f==0){
                int ll,rr;ll=l,rr=l;
            int i=l+1;
      for(i;i<=r;i++){
         if(num[i]<num[l]){
            ll++;
         }else{
         break;
         }
      }
       rr=ll;
    
       for(i;i<=r;i++){
         if(num[i]>=num[l]){
            rr++;
         }else{
         break;
         }
      }
    
      if(rr!=r){
        f=1;//no
      }
    //cout<<ll<<" dd "<<rr<<endl;
      if(f==0){
            //左子树
        dfs(l+1,ll);
            // 右子树
        dfs(ll+1,r);
    
        ans[cn++]=num[l];
        }
        }
    }
    
    int ff=0;
    void dfs2(int l,int r){
        if(l>r)
            return;
         //   cout<<ff<<endl;
        if(ff==0){
                int ll,rr;ll=l,rr=l;
            int i=l+1;
      for(i;i<=r;i++){
         if(num[i]>=num[l]){
            ll++;
         }else{
         break;
         }
      }
       rr=ll;
    
       for(i;i<=r;i++){
         if(num[i]<num[l]){
            rr++;
         }else{
         break;
         }
      }
    
      if(rr!=r){
        ff=1;//no
      }
    //cout<<ll<<" dd "<<rr<<endl;
      if(ff==0){
            //左子树
        dfs2(l+1,ll);
            // 右子树
        dfs2(ll+1,r);
    
        ans[cn++]=num[l];
        }
        }
    }
    int main()
    {
      int n;
      cin>>n;
    
      for(int i=0;i<n;i++){
        cin>>num[i];
      }
    
      dfs(0,n-1);
      if(f==0){
                printf("YES\n");
          cout<<ans[0];
      for(int i=1;i<n;i++){
    
        cout<<" "<<ans[i];
      }
      cout<<endl;
      }else{
    
       dfs2(0,n-1);
       if(ff)
      printf("NO\n");
      else{
            printf("YES\n");
          cout<<ans[0];
      for(int i=1;i<n;i++){
    
        cout<<" "<<ans[i];
      }
      cout<<endl;
      }
    
      }
    
    
    
    return 0;
    }
    

    L2-005. 集合相似度

    利用 stl set相关函数
    之前我同时用了 并交 集合,超时,其实只用一个交集合就可以求出并集合~~~

    #include <algorithm>
    #include <iostream>
    #include <set>
    #include<cstdio>
    using namespace std;
    set<int>s[51];
    int main()
    {
        int n;
        scanf("%d",&n);
       // cin>>n;
        int t;
        int a,b;
        set<int>ss;
        set<int>st;
        set<int>::iterator it;
        for(int i=1;i<=n;i++){
                scanf("%d",&t);
         //cin>>t;
         for(int j=0;j<t;j++)
         {
             scanf("%d",&a);
             //cin>>a;
         s[i].insert(a);
         }
        }
        cin>>t;
        for(int i=0;i<t;i++){
           ss.clear();
           st.clear();
            cin>>a>>b;
            set_intersection(s[a].begin(),s[a].end(),s[b].begin(),s[b].end(),inserter(ss,ss.begin()));
         //   set_union(s[a].begin(),s[a].end(),s[b].begin(),s[b].end(),inserter(st,st.begin()));
            double ans=100*ss.size();
            ans=ans/((s[a].size()+s[b].size())-ss.size());
            printf("%.2lf%%\n",ans);
        }
    
    
           return 0;
    }
    
    

    L2-006. 树的遍历

    #include <bits/stdc++.h>
    using namespace std;
    int tree[100000];
    void build(int rt,vector<int>a,vector<int>b)
    {
        if(a.size()==0||b.size()==0)
            return;
        int p=0;
    for(int i=0;i<b.size();i++){
        if(b[i]==a[b.size()-1]){
            p=i;
            break;//根节点
        }
    }
    
    
    
    vector<int>al,ar,bl,br;
    
    for(int i=0;i<p;i++){
    
        al.push_back(a[i]);
    }
    
    for(int i=p;i<a.size()-1;i++){
    
        ar.push_back(a[i]);
    }
    
    for(int i=0;i<p;i++){
    
        bl.push_back(b[i]);
    }
    
    
    for(int i=p+1;i<b.size();i++){
    
        br.push_back(b[i]);
    }
    
    tree[rt]=a[a.size()-1];
    build(rt<<1,al,bl);
    build(rt<<1^1,ar,br);
    return;
    }
    
    void bfs()
    {
        queue<int>q;
        q.push(1);
        int f=0;
        while(q.size()){
    
            int p=q.front();
            q.pop();
             if(f++){
                cout<<" ";
             }cout<<tree[p];
    
               if(tree[p<<1]!=-1){
                q.push(p<<1);
               }
             if(tree[p<<1^1]!=-1){
                q.push(p<<1^1);
             }
    
    
    
        }
        cout<<endl;
    }
    int main()
    {
        memset(tree,-1,sizeof(tree));
        int n;
        cin>>n;
        int t;
        vector<int>a,b;
        for(int i=0;i<n;i++){
       cin>>t;
       a.push_back(t);
        }
        for(int i=0;i<n;i++){
       cin>>t;
       b.push_back(t);
        }
      build(1,a,b);
      bfs();
    
           return 0;
    }
    
    
    
    
    // 其实不用vecotr 也可以的 直接传下标就可以了  !
    
    #include <bits/stdc++.h>
    using namespace std;
    int tree[100000];
    int a[100];int b[100];
    void build(int rt,int x,int xx,int y,int yy)
    {
        if(xx<=x||yy<=y)
        return;
        int p=0;
    for(int i=y;i<yy;i++){
        if(b[i]==a[xx-1]){
            p=i;
            break;//根节点
        }
    }
    int cn=p-y;
    tree[rt]=a[xx-1];
    build(rt<<1,x,x+cn,y,y+cn);
    build(rt<<1^1,x+cn,xx-1,p+1,yy);
    return;
    }
    void bfs()
    {
        queue<int>q;
        q.push(1);
        int f=0;
        while(q.size()){
    
            int p=q.front();
            q.pop();
             if(f++)
             cout<<" ";
             cout<<tree[p];
            if(tree[p<<1]!=-1)
                q.push(p<<1);
             if(tree[p<<1^1]!=-1)
                q.push(p<<1^1);
        }
        cout<<endl;
    }
    int main()
    {
        memset(tree,-1,sizeof(tree));
        int n;
        cin>>n;
        int t;
        for(int i=0;i<n;i++)
        cin>>a[i];
        for(int i=0;i<n;i++)
        cin>>b[i];
        build(1,0,n,0,n);
        bfs();
        return 0;
    }
    
    
    

    L2-011. 玩转二叉树

    #include <bits/stdc++.h>
    using namespace std;
    int tree[100000];
    void build(int rt,vector<int>a,vector<int>b)
    {
        if(a.size()==0||b.size()==0)
            return;
        int p=0;
    for(int i=0;i<a.size();i++){
        if(a[i]==b[0]){
            p=i;
            break;//根节点
        }
    }
    
    
    
    vector<int>al,ar,bl,br;
    
    for(int i=0;i<p;i++){
    
        al.push_back(a[i]);
    }
    
    for(int i=p+1;i<a.size();i++){
    
        ar.push_back(a[i]);
    }
    
    for(int i=1;i<p+1;i++){
    
        bl.push_back(b[i]);
    }
    
    
    for(int i=p+1;i<b.size();i++){
    
        br.push_back(b[i]);
    }
    
    tree[rt]=b[0];
    build(rt<<1,al,bl);
    build(rt<<1^1,ar,br);
    return;
    }
    
    void bfs()
    {
        queue<int>q;
        q.push(1);
        int f=0;
        while(q.size()){
    
            int p=q.front();
            q.pop();
             if(f++){
                cout<<" ";
             }cout<<tree[p];
    
             if(tree[p<<1^1]!=-1){
                q.push(p<<1^1);
             }
              if(tree[p<<1]!=-1){
                q.push(p<<1);
    
        }
        }
        cout<<endl;
    }
    int main()
    {
        memset(tree,-1,sizeof(tree));
        int n;
        cin>>n;
        int t;
        vector<int>a,b;
        for(int i=0;i<n;i++){
       cin>>t;
       a.push_back(t);
        }
        for(int i=0;i<n;i++){
       cin>>t;
       b.push_back(t);
        }
      build(1,a,b);
      bfs();
    
           return 0;
    }
    
    

    L2-012. 关于堆的判断

    参考大佬代码

    L2-007. 家庭房产

    题很简单,但是信息比较多容易搞错,并查集好久没写了,忘了写合并了 GG

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    struct Node
    {
        bool f=false;
        int mo=-1;int fa=-1;
        bool bm=false;
        int cn=0;
        double area=0;
        int peo=1;
        int pre=0;
        int mid=0;
    }node[10005];
    int n,t,a,b,s,tt;
    int c;
    int ch;
    double area;
    int pa,pb;
    int findpre(int x)
    {
        if(node[x].pre!=x){
            node[x].pre=findpre(node[x].pre);
        }
        return node[x].pre;
    }
    
    struct no2{
    int id;
    double area;
    int cn;
    int peo;
    }node2[10000];
    bool vis[10000];
    bool cmp(struct no2 a,struct no2 b)//人均面积降序输出,成员编号升序输出
    {
        if(a.area*b.peo==b.area*a.peo){
            return a.id<b.id;
        }
        return  a.area*b.peo>b.area*a.peo;
    }
    int main()
    {
        cin>>n;
        for(int i=0;i<10000;i++){
            node[i].pre=i;
            node[i].mid=i;
        }
        for(int i=0;i<n;i++){
            cin>>s;
            cin>>a>>b;
            node[s].f=true;
            node[s].fa=a;node[s].mo=b;
            t=findpre(s);
            if(a!=-1){
                node[a].f=true;
                tt=findpre(a);
                node[tt].pre=t;
            }
            if(b!=-1){
                node[b].f=true;
                tt=findpre(b);
                node[tt].pre=t;
            }
            cin>>ch;
            for(int j=0;j<ch;j++){
                    cin>>a;
                 node[a].f=true;
                  tt=findpre(a);
                node[tt].pre=t;
            }
            cin>>c>>area;
            node[s].area=area;
            node[s].cn+=c;
        }
        int cc=0;
        for(int i=0000;i<10000;i++){
                if(node[i].f){
                        t=findpre(i);
                 if(t!=i){
                 node[t].peo+=node[i].peo;
                 node[t].area+=node[i].area;
                 node[t].cn+=node[i].cn;
                 node[t].mid=min(node[t].mid,node[i].mid);
                }
                }
        }
        for(int i=0000;i<10000;i++){
                if(node[i].f){
                        t=findpre(i);
                if(vis[t]==0){
                 vis[t]=1;
    
                 node2[cc].area=node[t].area;
                 node2[cc].id=node[t].mid;
                 node2[cc].cn=node[t].cn;
                 node2[cc].peo=node[t].peo;
    
                 cc++;
                }
                }
        }
        sort(node2,node2+cc,cmp);
      cout<<cc<<endl;
        for(int i=0;i<cc;i++){
              //  cout<<node2[i].peo<<" "<<node2[i].area<<endl;
            printf("%04d %d %.3lf %.3lf\n",node2[i].id,node2[i].peo,(double)node2[i].cn/(double)node2[i].peo,node2[i].area/node2[i].peo);
        }
        return 0;
    }
    
    

    L2-008. 最长对称子串

    之前 用的三层循环 也有一个样例超时了

    改成两层循环过了,分为 奇数与偶数对称即可

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    string s;
    // 12345678910019
    bool check(int i,int j){
    
    for(int k=i,m=1;k<i+j/2;k++,m++){
    
        if(s[k]!=s[i+j-m]) //  1  11
            return false;
    }
    
    return true;
    }
    int main()
    {
        getline(cin,s);
        int ans=1;
    
        for(int i=0;i<s.size();i++){
    
            int l,r;
            l=r=i;
            r=i+1;
            int cn=0;
            while(l>=0&&r<s.size()&&s[l]==s[r]){
                cn++;
                l--;r++;
            }
            ans=max(cn*2,ans);
            cn=0;
            l=i-1;
            r=i+1;
            while(l>=0&&r<s.size()&&s[l]==s[r]){
                cn++;
                l--;r++;
            }
             ans=max(cn*2+1,ans);
        }
    
    
        cout<<ans<<endl;
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:2018-03-27 PAT补题练习题

          本文链接:https://www.haomeiwen.com/subject/pbpjcftx.html