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\n",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]='\0';
    }

    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\n",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\n",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]='\0';   //獲取list的名字

                        //printf("%s\n",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]='\0';     //獲取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\n");
                        }
                        else
                        {
                            printf("%d\n",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]='\0';    //獲取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]='\0';   //獲取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\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



題目地址: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("\n");
        }
    }
    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\n",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\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
*/



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM