據江湖傳聞,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
解題思路:
先分析題目大意。總共同擁有四種操作。
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
*/
