2014北邮计算机考研复试上机题解(上午+下午)

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


先来看上午的题目。

A.众数-计算机一2014

2014北邮计算机考研复试上机题解(上午+下午)_第1张图片

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

直接统计即可。

AC代码:

#include
#include
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; ians)
                    {
                        ans=cnt;
                        res=a[i-1];
                    }
                    cnt=1;
                }
                else
                    cnt++;
            }
            if(cnt>ans)   //最后一个数还没判断
            {
                ans=cnt;
                res=a[i-1];
            }
            printf("%d\n",res);
        }
    }
    return 0;
}

/*
2
4
1 1 1 2
5
1 1 2 2 3
*/

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

2014北邮计算机考研复试上机题解(上午+下午)_第2张图片

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


解题思路:

我们可以简化思路,写一个旋转90度的函数。如果选择180度则执行两次,270度,则执行三次。。

PS:记得交换m,n。


AC代码:

#include
#include
using namespace std;

char a[55][55];
char b[55][55];
int m,n;

void rotate()
{
    int i,j;
    for(i=0; i


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

2014北邮计算机考研复试上机题解(上午+下午)_第3张图片

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


解题思路:

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

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


AC代码:

#include
#include
#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


D. Python List-计算机一2014

2014北邮计算机考研复试上机题解(上午+下午)_第4张图片
2014北邮计算机考研复试上机题解(上午+下午)_第5张图片

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


解题思路:

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

a=[]

a.sort()

a.append(int)

a.[int]

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


AC代码:

#include
#include
#include
#include
#define maxn 105
using namespace std;

int a[maxn][maxn];   //a[t]表示list映射到t的数组
int len[maxn];       //len[t]表示list映射到t的长度
map  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; ia[x][j])
                                {
                                    tmp=a[x][i];
                                    a[x][i]=a[x][j];
                                    a[x][j]=tmp;
                                }
                            }
                        }
                    }
                    else
                    {
                        for(i=0; i



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

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


再来看看的题目。

A. 中位数-计算机二2014

2014北邮计算机考研复试上机题解(上午+下午)_第6张图片

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


解题思路:

n分奇数和偶数讨论,

如果是奇数,直接输出下标为(n/2+1)即可(我是下标从1开始的)

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


AC代码:

#include
#include
#include
#include
#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\n",a[n/2+1]);
            else
            {
                int t = ((double(a[n/2])+a[n/2+1])/2)*10;   //把结果放大10倍
                if(t%10==0)
                    printf("%d\n",t/10);
                else
                    printf("%.1f\n",double(t)/10);
            }
        }
    }
    return 0;
}

/*
2
4
1 1 2 2
5
1 1 2 2 3
*/

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

2014北邮计算机考研复试上机题解(上午+下午)_第7张图片

2014北邮计算机考研复试上机题解(上午+下午)_第8张图片

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


解题思路:

由于是最佳适应,可以把最开始的内存按照从小到大排序。然后设立一个vis访问数组。每次新来一个就从从开头遍历这个数组,找到第一个>=这个值,并且vis为0(未使用)的,然后把vis置1。详见代码


AC代码:

#include
#include
#include
#include
#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; i0) printf(" ");    
                flag=0;

                scanf("%d",&d);
                for(i=0; i=d&&!vis[i])   //找到第一个>=d并且未使用的
                    {
                        vis[i]=1;
                        printf("%d",a[i]);
                        flag=1;
                        break;
                    }
                }
                if(!flag)   //没找到,输出NULL
                    printf("NULL");
            }
            printf("\n");
        }
    }
    return 0;
}

/*
2
4
7 5 10 3
2
4 6
4
3 5 9 10
3
5 12 6
*/

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

2014北邮计算机考研复试上机题解(上午+下午)_第9张图片

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


解题思路:

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


AC代码:

#include
#include
#include
#include
#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=0&&cy


D. 汇编-计算机二20142014北邮计算机考研复试上机题解(上午+下午)_第10张图片

2014北邮计算机考研复试上机题解(上午+下午)_第11张图片

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


解题思路:

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

ADD

MOV

逗号之前是AX,AL,AH这个分三类讨论。我把AX,BX,CX,DX的值存到了一个数组里。分别对应a[0,1,2,3]

这样方便处理。


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


AC代码:

#include
#include
#include
#include
#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'))   
                {   //逗号之后的数如果是AX,AL,AH之类的
                    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='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\n",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
*/


你可能感兴趣的:(套题)