zoukankan      html  css  js  c++  java
  • 2014北邮计算机考研复试上机题解(上午+下午)

    据江湖传闻,2014年计算机机试分为了上午、下午两批。


    先来看上午的题目。

    A.众数-计算机一2014


    题目地址:A.众数-计算机一2014

    直接统计就可以。

    AC代码:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int a[105];
    
    int main()
    {
        int tes;
        int n,i;
    
        while(~scanf("%d",&tes))
        {
            while(tes--)
            {
                scanf("%d",&n);
                for(i=0; i<n; i++)
                    scanf("%d",&a[i]);
    
                int cnt=1;   //记录出现的次数
                int res,ans=0;
                for(i=1; i<n; i++)
                {
                    if(a[i]!=a[i-1])
                    {
                        if(cnt>ans)
                        {
                            ans=cnt;
                            res=a[i-1];
                        }
                        cnt=1;
                    }
                    else
                        cnt++;
                }
                if(cnt>ans)   //最后一个数还没推断
                {
                    ans=cnt;
                    res=a[i-1];
                }
                printf("%d
    ",res);
            }
        }
        return 0;
    }
    
    /*
    2
    4
    1 1 1 2
    5
    1 1 2 2 3
    */

    B. 旋转图像-计算机一2014


    题目地址:B. 旋转图像-计算机一2014


    解题思路:

    我们能够简化思路,写一个旋转90度的函数。假设选择180度则运行两次,270度。则运行三次。。

    PS:记得交换m,n。


    AC代码:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    char a[55][55];
    char b[55][55];
    int m,n;
    
    void rotate()
    {
        int i,j;
        for(i=0; i<m; i++)   //顺时针旋转90度后保存到b数组里
        {
            for(j=0; j<n; j++)
                b[j][m-1-i]=a[i][j];
        }
        for(i=0; i<n; i++)   //保存回a数组
        {
            for(j=0; j<m; j++)
                a[i][j]=b[i][j];
            a[i][j]='';
        }
    
        int tmp=m;    //记得交换m,n
        m=n;
        n=tmp;
    }
    
    int main()
    {
        int tes;
        int i,j;
    
        while(~scanf("%d",&tes))
        {
            while(tes--)
            {
                scanf("%d%d",&m,&n);
                for(i=0; i<m; i++)
                    scanf("%s",a[i]);
    
                int d;
                scanf("%d",&d);
                d=d/90;     //推断要旋转的次数
                while(d--)
                    rotate();
                for(i=0; i<m; i++)
                    printf("%s
    ",a[i]);
            }
        }
        return 0; 
    }
    
    /*
    2
    2 3
    111
    000
    90
    3 3
    111
    101
    111
    180
    */


    C. 网络的核-计算机一2014


    题目地址:C. 网络的核-计算机一2014


    解题思路:

    这题的思路就是先用floyd求出随意两点的最短距离。然后看哪个点事要求的点。

    PS:记得floyd的顺序是k,i,j。表示初试的时候大题i,j,k顺序写错了。。


    AC代码:

    #include<iostream>
    #include<cstdio>
    #define maxn 55
    using namespace std;
    int m,n;
    int dis[maxn][maxn];
    
    void floyd()   //floyd的顺序k,i,j 
    {
        int i,j,k;
        for(k=1; k<=n; k++)
            for(i=1; i<=n; i++)
                for(j=1; j<=n; j++)
                {
                    if(dis[i][j]>dis[i][k]+dis[k][j])
                        dis[i][j]=dis[i][k]+dis[k][j];
                }
    }
    
    int main()
    {
        int tes;
        int i,j;
    
        while(~scanf("%d",&tes))
        {
            while(tes--)
            {
                scanf("%d%d",&n,&m);
                for(i=1; i<=n; i++)   //初试化 
                {
                    for(j=1; j<=n; j++)
                        dis[i][j]=n;
                    dis[i][i]=0;
                }
    
                int a,b;
                for(i=0; i<m; i++)
                {
                    scanf("%d%d",&a,&b);
                    dis[a][b]=dis[b][a]=1;
                }
    
                floyd();
                int res,mi=100000000;
                for(i=1; i<=n; i++)   //统计每一个点到其它全部点的距离和,选最小的 
                {
                    int tt=0;
                    for(j=1; j<=n; j++)
                    {
                        tt+=dis[i][j];
                    }
                    if(tt<mi)
                    {
                        mi=tt;
                        res=i;
                    }
                }
    
                printf("%d
    ",res);
            }
        }
        
        return 0; 
    }
    
    /*
    2
    3 3
    1 2
    1 3
    2 3
    
    4 2
    1 2
    2 3
    */


    D. Python List-计算机一2014




    题目地址:D. Python List-计算机一2014


    解题思路:

    先分析题目大意。总共同拥有四种操作。

    a=[]

    a.sort()

    a.append(int)

    a.[int]

    用一个map将list的名字和数组下标相应,然后分析每一个操作。详见代码。


    AC代码:

    #include<iostream>
    #include<cstdio>
    #include<map>
    #include<cstring>
    #define maxn 105
    using namespace std;
    
    int a[maxn][maxn];   //a[t]表示list映射到t的数组
    int len[maxn];       //len[t]表示list映射到t的长度
    map <string,int> mq;
    
    int main()
    {
        int tes,n,i,j;
        char str[maxn];
        char nam[maxn];
        while(~scanf("%d",&tes))
        {
            while(tes--)
            {
                scanf("%d",&n);
                mq.clear();
                memset(len,0,sizeof(len));
                int t=0,x;
                int l;
                while(n--)
                {
                    scanf("%s",str);
                    l=strlen(str);
                    if(str[l-1]==']')
                    {
                        if(str[l-2]=='[')   //.[]
                        {
                            for(i=0; i<l; i++)
                            {
                                if(str[i]=='=')
                                    break;
                                nam[i]=str[i];
                            }
                            nam[i]='';   //获取list的名字
    
                            //printf("%s
    ",nam);
                            if(!mq[nam])
                            {
                                mq[nam]=t;
                                len[t]=0;
                                t++;
                            }
                            else
                            {
                                len[mq[nam]]=0;
                            }
                        }
                        else    //.[int]
                        {
                            for(i=0; i<l; i++)
                            {
                                if(str[i]=='[')
                                    break;
                                nam[i]=str[i];
                            }
                            nam[i]='';     //获取list的名字
    
                            int d=0;   //得到int的值
                            i++;
                            for(i; i<l-1; i++)
                            {
                                d=d*10+(str[i]-'0');
                            }
    
                            x=mq[nam];
                            //cout<<"d:"<<d<<endl;
                            if(len[x]<=d)
                            {
                                printf("ERROR
    ");
                            }
                            else
                            {
                                printf("%d
    ",a[x][d]);
                            }
                        }
                    }
                    else
                    {
                        if(str[l-2]=='(')   //.sort()
                        {
                            for(i=0; i<l; i++)
                            {
                                if(str[i]=='.')
                                    break;
                                nam[i]=str[i];
                            }
                            nam[i]='';    //获取list的名字
    
                            x=mq[nam];
                            int tmp;
                            for(i=0; i<len[x]; i++)
                            {
                                for(j=i+1; j<len[x]; j++)
                                {
                                    if(a[x][i]>a[x][j])
                                    {
                                        tmp=a[x][i];
                                        a[x][i]=a[x][j];
                                        a[x][j]=tmp;
                                    }
                                }
                            }
                        }
                        else
                        {
                            for(i=0; i<l; i++)
                            {
                                if(str[i]=='.')
                                    break;
                                nam[i]=str[i];
                            }
                            nam[i]='';   //获取list的名字
    
                            x=mq[nam];
                            int d=0;    //得到int的值
                            i+=8;
                            for(i; i<l-1; i++)
                            {
                                d=d*10+(str[i]-'0');
                            }
                            a[x][len[x]]=d;
                            len[x]++;
                        }
                    }
                }
            }
        }
        return 0;
    }
    
    /*
    2
    5
    a=[]
    a.append(0)
    a.append(1)
    a[0]
    a[1]
    8
    lista=[]
    lista.append(123)
    lista.append(65)
    lista[0]
    lista.sort()
    lista[0]
    listb=[]
    listb[0]
    */



    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    再来看看的题目。

    A. 中位数-计算机二2014


    题目地址:A. 中位数-计算机二2014


    解题思路:

    n分奇数和偶数讨论,

    假设是奇数,直接输出下标为(n/2+1)就可以(我是下标从1開始的)

    假设是偶数,输出n/2与n/2+1和的一半就可以。只是因为输出时要控制不要末尾的0。因为数组里都是int,能够把结果放大10倍,假设能够被10整除。输出int就可以。否则输出一位小数(仅仅能是.5)


    AC代码:

    #include<iostream>
    #include<cstdio>
    #include<map>
    #include<cstring>
    #define maxn 105
    using namespace std;
    
    int a[maxn];
    
    int main()
    {
        int tes,n,i;
    
        while(~scanf("%d",&tes))
        {
            while(tes--)
            {
                scanf("%d",&n);
                for(i=1; i<=n; i++)
                    scanf("%d",&a[i]);
                if(n%2==1)
                    printf("%d
    ",a[n/2+1]);
                else
                {
                    int t = ((double(a[n/2])+a[n/2+1])/2)*10;   //把结果放大10倍
                    if(t%10==0)
                        printf("%d
    ",t/10);
                    else
                        printf("%.1f
    ",double(t)/10);
                }
            }
        }
        return 0;
    }
    
    /*
    2
    4
    1 1 2 2
    5
    1 1 2 2 3
    */

    B. 内存分配-网妍14-计算机二14



    题目地址:B. 内存分配-网妍14-计算机二14


    解题思路:

    因为是最佳适应。能够把最開始的内存依照从小到大排序。然后设立一个vis訪问数组。

    每次新来一个就从从开头遍历这个数组,找到第一个>=这个值,而且vis为0(未使用)的。然后把vis置1。详见代码


    AC代码:

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #define maxn 105
    using namespace std;
    
    int a[maxn];
    int vis[maxn];
    
    int main()
    {
        int tes,n,m,i,j;
        while(~scanf("%d",&tes))
        {
            while(tes--)
            {
                scanf("%d",&n);
                for(i=0; i<n; i++)
                    scanf("%d",&a[i]);
                sort(a,a+n);    //从小到大排序
                memset(vis,0,sizeof(vis));  //vis初始化为0
    
                scanf("%d",&m);
    
                int flag,d;
                for(j=0; j<m; j++)
                {
                    if(j>0) printf(" ");    
                    flag=0;
    
                    scanf("%d",&d);
                    for(i=0; i<n; i++)
                    {
                        if(a[i]>=d&&!vis[i])   //找到第一个>=d而且未使用的
                        {
                            vis[i]=1;
                            printf("%d",a[i]);
                            flag=1;
                            break;
                        }
                    }
                    if(!flag)   //没找到,输出NULL
                        printf("NULL");
                }
                printf("
    ");
            }
        }
        return 0;
    }
    
    /*
    2
    4
    7 5 10 3
    2
    4 6
    4
    3 5 9 10
    3
    5 12 6
    */

    C. 图像识别-计算机二2014


    题目地址:C. 图像识别-计算机二2014


    解题思路:

    这个就是个dfs的题目,从一个点出发。能够把他周围的八个方向的点满足条件的都遍历了。假设能够他们就是一类。继续搜。


    AC代码:

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #define maxn 105
    using namespace std;
    int m,n,d;
    
    int a[maxn][maxn];
    int vis[maxn][maxn];
    int dir[8][2]= {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};   //八个方向
    
    int ab(int p)
    {
        if(p<0)
            p=0-p;
        return p;
    }
    
    void dfs(int x,int y)
    {
        int i,cx,cy;
        for(i=0; i<8; i++)
        {
            cx=x+dir[i][0];
            cy=y+dir[i][1];
            if(cx>=0&&cx<m&&cy>=0&&cy<n&&!vis[cx][cy]&&ab(a[cx][cy]-a[x][y])<=d)    //满足条件的点
            {
                vis[cx][cy]=1;
                dfs(cx,cy);
            }
        }
        return;
    }
    
    int main()
    {
        int tes,i,j;
        while(~scanf("%d",&tes))
        {
            while(tes--)
            {
                scanf("%d%d%d",&m,&n,&d);
                for(i=0; i<m; i++)
                {
                    for(j=0; j<n; j++)
                    {
                        scanf("%d",&a[i][j]);
                        vis[i][j]=0;
                    }
                }
    
                int res=0;
                for(i=0; i<m; i++)
                {
                    for(j=0; j<n; j++)
                    {
                        if(!vis[i][j])
                        {
                            res++;
                            vis[i][j]=1;
                            dfs(i,j);
                        }
                    }
                }
    
                printf("%d
    ",res);
            }
        }
        return 0;
    }
    
    /*
    2
    3 3 0
    1 1 1
    0 1 0
    0 1 0
    3 4 1
    10 11 12 13
    9 8 7 6
    2 3 4 5
    */


    D. 汇编-计算机二2014



    题目地址:D. 汇编-计算机二2014


    解题思路:

    先分析题目大意。总共同拥有两种操作。

    ADD

    MOV

    逗号之前是AX,AL,AH这个分三类讨论。我把AX,BX,CX,DX的值存到了一个数组里。

    分别相应a[0,1,2,3]

    这样方便处理。


    逗号之后须要分情况讨论,一种是AX,AL,AH这样的。另一种就是二进制,十六进制,十进制的数这样的。把这个结果保存到tmp就可以。详见代码。


    AC代码:

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #define maxn 105
    using namespace std;
    int m,n,d;
    
    int a[4];
    char str[maxn];
    char op[maxn];
    
    int main()
    {
        int tes,n,i;
        while(~scanf("%d",&tes))
        {
            while(tes--)
            {
                scanf("%d",&n);
                memset(a,0,sizeof(a));
                while(n--)
                {
                    scanf("%s",op);
                    scanf("%s",str);
    
                    int len=strlen(str);
                    int t=str[0]-'A';
                    int tmp=0;
                    if(str[len-1]=='X'||str[len-1]=='L'||(str[len-1]=='H'&&str[3]!='0'))   
                    {   //<span style="font-family: Arial, Helvetica, sans-serif;">逗号之后的数假设是AX,AL,AH之类的</span>
                        int t2=str[len-2]-'A';
                        if(str[len-1]=='X')	tmp=a[t2];
                        else if(str[len-1]=='L') tmp=a[t2]%256;
                        else tmp=a[t2]/256;
                    }
                    else   //逗号之后的数假设是二进制,十进制。十六进制的
                    {
                        int d;
                        if(str[len-1]=='H')  //十六进制
                            d=16;
                        else if(str[len-1]=='B')   //二进制
                            d=2;
                        else    //十进制
                        {
                            len++;
                            d=10;
                        }
    
                        int x;
                        for(i=3; i<len-1; i++)
                        {
                            if(str[i]>='0'&&str[i]<='9')
                                x=str[i]-'0';
                            else
                                x=str[i]-'A'+10;
                            tmp=tmp*d+x;
                        }
                    }
    
                    if(strcmp(op,"MOV")==0)    //假设是MOV
                    { 
                        if(str[1]=='X')	a[t]=tmp;
                        else if(str[1]=='L') a[t]=a[t]/256*256+tmp;
                        else a[t]=a[t]%256+tmp*256;
                    }
                    else     //假设是ADD
                    {
                        if(str[1]=='X')	a[t]+=tmp;
                        else if(str[1]=='L') a[t]+=tmp;
                        else a[t]=a[t]+tmp*256;
                    }
                }
    
                printf("%d %d %d %d
    ",a[0],a[1],a[2],a[3]);
            }
        }
        return 0;
    }
    
    /*
    2
    3
    MOV AX,2
    MOV BX,3
    ADD AX,BX
    5
    MOV AX,2
    MOV BX,030H
    MOV CX,11B
    ADD AX,CX
    ADD DL,CL
    */


  • 相关阅读:
    企业——Zabbix分布式服务监控平台添加监控服务(http、nginx、mysql)
    企业——Zabbix proxy分布式监控配置
    企业——Zabbix Agent Active 主动模式监控
    Linux背背背(4)vim操作
    Linux背背背(3)
    Linux背背背(2)
    如何防止远程提交?
    PHP常用的转义函数
    本博客点击页面,浮出文字的特效
    华硕R系列的解剖图
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7305588.html
Copyright © 2011-2022 走看看