首页 > 代码库 > 浙大PAT考试1077~1080(2014上机复试题目)

浙大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]=‘\0‘;
        myreverse(ans);

        if(p==0) puts("nai");
        else printf("%s\n",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\n",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
*/



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