• 浙大PAT考试1077~1080(2014上机复试题目)


    题目地址:点击打开链接


    还是太弱。


    英文太差。,,


    预计要等待被虐了。。


    1077

    找最长的公共后缀,暴力就能够写:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<string>
    using namespace std;
    
    char  a[105][1005];
    int milen;
    
    void myreverse(char *s)
    {
        int len=strlen(s);
        milen=min(len,milen);
        for(int i=0; i<len/2; i++)
        {
            char tmp=s[i];
            s[i]=s[len-1-i];
            s[len-1-i]=tmp;
        }
    }
    
    int main()
    {
        int n,i,j;
    
        while(cin>>n)
        {
            gets(a[0]);
            milen=10005;
    
            for(i=0; i<n; i++)
            {
                gets(a[i]);
                myreverse(a[i]);
            }
    
            for(i=0; i<milen; i++)
            {
                int flag=0;
                for(j=1; j<n; j++)
                {
                    if(a[j][i]!=a[0][i])
                    {
                        flag=1;
                        break;
                    }
                }
                if(flag) break;
            }
    
            int p=i;
            char ans[1005];
            for(i=0; i<p; i++)
                ans[i]=a[0][i];
            ans[i]='';
            myreverse(ans);
    
            if(p==0) puts("nai");
            else printf("%s
    ",ans);
    
        }
        return 0;
    }
    
    /*
    3
    Itai nyan~
    Ninjin wa iyadanyan~
    uhhh nyan~
    
    3
    Itai!
    Ninjinnwaiyada T_T
    T_T
    */
    


    1078:

    hash散列啊,二次探測啊,单词看不懂。。

    #include<cstdio>
    #include<cmath>
    #include<iostream>
    #include<cstring>
    #include<string>
    using namespace std;
    const int maxn=20005;
    
    int prim[maxn];
    int mp[maxn];
    int tmpprim[maxn];
    
    int visi[maxn];
    int ans[maxn];
    
    void sxprim()
    {
        int i,j;
        memset(prim,1,sizeof(prim));
        prim[1]=0;
    
        for(i=2;i<maxn;i++)
        {
            if(prim[i])
            {
                for(j=i*2;j<maxn;j+=i)
                    prim[j]=0;
            }
        }
    
        int cnt=0;
        for(i=maxn-1;i>=2;i--)
        {
            if(prim[i])
                tmpprim[cnt++]=i;
        }
    
        for(i=0;i<cnt-1;i++)
        {
            int tmp=tmpprim[i];
            int k=tmpprim[i+1];
            for(j=tmp;j>k;j--)
                mp[j]=tmp;
        }
    
        for(j=1;j<=tmpprim[cnt-1];j++)
            mp[j]=tmpprim[cnt-1];
    
        //for(i=1;i<=20;i++)
            //cout<<i<<" "<<mp[i]<<endl;
    }
    
    int main()
    {
        sxprim();
    
        int mod,n,i;
    
        while(cin>>mod>>n)
        {
            mod=mp[mod];  //re-defined
            memset(visi,0,sizeof(visi));
    
            for(i=0;i<n;i++)
            {
                int x;
                cin>>x;
                int cur=x%mod;
                if(!visi[cur])
                {
                    visi[cur]=1;
                    ans[i]=cur;
                }
                else
                {
                    int cnt=1;
                    int flag=0;
                    while(cnt<=maxn)   //探測法都搞错了。。
                    {
                        int p=(cnt*cnt+cur)%mod;
                        if(!visi[p])
                        {
                            visi[p]=1;
                            ans[i]=p;
                            flag=1;
                            break;
                        }
                        cnt++;
                    }
    
                    if(!flag)
                        ans[i]=-1;
                }
            }
    
            for(i=0;i<n;i++)
            {
                if(i) cout<<" ";
                if(ans[i]>=0) cout<<ans[i];
                else cout<<"-";
            }
            cout<<endl;
        }
        return 0;
    }
    
    /*
    11 8
    2 2 2 2 2 2 2 2
    */
    


    1079:

    就是给你一颗树。找叶子结点,叶子结点有值,然后从根往下每一层会以r%添加。

    不预处理会超时。。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<vector>
    const int maxn=100005;
    using namespace std;
    
    vector <int> mq[maxn];
    int n;
    double p,r;
    
    /*double cal(int step)
    {
        double ans=p;
        for(int i=0; i<step; i++)
            ans=ans*(r/100.0+1.0);
        return ans;
    
    }*/
    
    double tt[maxn];
    void cal()   //预处理之后就不会超时了,时间换空间
    {
        tt[0]=p;
        for(int i=1;i<maxn;i++)
            tt[i]=tt[i-1]*(1.0+r/100.0);
    }
    
    int height[maxn];
    double val[maxn];
    
    double ans;
    
    void dfs(int cur)
    {
        int len=mq[cur].size();
        int i;
        if(len==0)
        {
            ans+=val[cur]*tt[height[cur]];
            return;
        }
        else
        {
            for(i=0;i<len;i++)
            {
                int p=mq[cur][i];
                height[p]=height[cur]+1;
                dfs(p);
            }
        }
    }
    
    int main()
    {
        int i;
        while(cin>>n)
        {
            cin>>p>>r;
            cal();
            for(i=0; i<n; i++)
                mq[i].clear();
            height[0]=0;
    
            int x,chi;
            for(i=0; i<n; i++)
            {
                cin>>x;
                if(x)
                {
                    while(x--)
                    {
                        cin>>chi;
                        mq[i].push_back(chi);
                    }
                }
                else
                {
                    cin>>val[i];
                }
            }
    
            ans=0;
            dfs(0);
            printf("%.1f
    ",ans);
        }
        return 0;
    }
    
    /*
    10 1.80 1.00
    3 2 3 5
    1 9
    1 4
    1 7
    0 7
    2 6 1
    1 8
    0 9
    0 4
    0 3
    */
    


    1080:

    这个最后也仅仅能拿24分/30分。有个错误。有个数据跑出来段错误。

    我预计是数据是每一个学校定额有0的情况。

    。不然错的没道理啊。。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<vector>
    #include<set>
    const int maxn=40005;
    using namespace std;
    
    int n,m,k;
    int peo[maxn];
    //set <int> ans[maxn];
    //set <int> ::iterator mq;
    vector <int> ans[105];
    
    struct node
    {
        int index;
        int ge;
        int gi;
        int total;
        int aim[6];
    }nod[maxn];
    
    struct nodd
    {
        int ge;
        int gi;
    }last[105];  //暂存每一个学校录取成绩最低的人。假设有同样成绩的也加进去
    
    int cmp(node p1,node p2)
    {
        if(p1.total>p2.total) return 1;
        else if(p1.total==p2.total&&p1.ge>p2.ge) return 1;
        //else if(p1.total==p2.total&&p1.ge==p2.ge&&p1.gi>p2.gi) return 1;
        return 0;
    }
    
    int main()
    {
        int i,j;
        int a[10];
        while(cin>>n>>m>>k)
        {
            for(i=0;i<n;i++)
                ans[i].clear();
            for(i=0;i<m;i++)
                cin>>peo[i];
    
            for(i=0;i<n;i++)
            {
                cin>>nod[i].ge>>nod[i].gi;
                for(j=0;j<k;j++)
                    cin>>nod[i].aim[j];
                nod[i].total=nod[i].ge+nod[i].gi;
                nod[i].index=i;
            }
    
            sort(nod,nod+n,cmp);
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                    a[j]=nod[i].aim[j];
                for(j=0;j<m;j++)
                {
                    if(peo[a[j]])
                    {
                        peo[a[j]]--;
                        ans[a[j]].push_back(nod[i].index);
                        if(peo[a[j]]==0)
                        {
                            last[a[j]].ge=nod[i].ge;
                            last[a[j]].gi=nod[i].gi;
                        }
                        break;
                    }
                    else
                    {
                        if(nod[i].ge==last[a[j]].ge&&nod[i].gi==last[a[j]].gi)
                        {
                            ans[a[j]].push_back(nod[i].index);
                            break;
                        }
                    }
                }
            }
    
            for(i=0;i<m;i++)
            {
                if(ans[i].size()==0) puts("");
                else
                {
                    int len=ans[i].size();
                    sort(ans[i].begin(),ans[i].end());
                    /*mq=ans[i].begin();
    
                    int flag=0;
                    for(;mq!=ans[i].end();mq++)
                    {
                        if(flag) cout<<" ";
                        else flag=1;
                        cout<<*mq;
                    }*/
                    for(j=0;j<len;j++)
                    {
                        if(j>0) cout<<" ";
                        cout<<ans[i][j];
                    }
                    cout<<endl;
                }
            }
        }
        return 0;
    }
    
    /*
    11 6 3
    2 1 2 2 2 3
    100 100 0 1 2
    60 60 2 3 5
    100 90 0 3 4
    90 100 1 2 0
    90 90 5 1 3
    80 90 1 0 2
    80 80 0 1 2
    80 80 0 1 2
    80 70 1 3 2
    70 80 1 2 3
    100 100 0 2 4
    */
    



  • 相关阅读:
    Java中的多态polymorphism
    Java中的“继承”
    面向对象(Oriented Object Programing)的本质
    Java设计方法原则
    Motor Parameter
    Motor Vocabuary
    JD
    CAN
    多个TXT文件合成一个,输出到excel里
    正则表达式
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6789237.html
Copyright © 2020-2023  润新知