浙大计算机学院考研复试上机试题及参考答案Word文档下载推荐.docx
- 文档编号:6448252
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:48
- 大小:50.86KB
浙大计算机学院考研复试上机试题及参考答案Word文档下载推荐.docx
《浙大计算机学院考研复试上机试题及参考答案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《浙大计算机学院考研复试上机试题及参考答案Word文档下载推荐.docx(48页珍藏版)》请在冰点文库上搜索。
*/
charresult[30];
/*转换后的表达式参数,如
do{
a=b=i=j=k=0;
/*初始化变量*/
memset(str,0,sizeof(str));
memset(temp,0,sizeof(temp));
memset(result,0,sizeof(result));
gets(str);
/*获取输入字符串,不能使用scanf,因为
有空格*/
for(i=0,k=0;
i<
strlen(str);
++i)
for(j=0;
!
isspace(str[i])&
&
i<
++i,++j)
/*提取一个单词*/
temp[j]=str[i];
temp[j]=0;
/*字符串结束标记*/
j<
12;
j++)/*把这个单词转换为数字*/
if(strcmp(temp,data[j])==0)
if(j<
=9)result[k++]=j+'
0'
;
if(j==10)result[k++]='
+'
if(j==11)result[k++]='
='
break;
/*找到匹配数字就不必再搜索了*/
字符串结束标记,result形式
result[k]=0;
/*
123+456="
sscanf(result,"
%d+%d="
&
a,&
b);
/*用sscanf来获
得a,b的值*/
if(a==0&
b==0)break;
/*A,B同时为零则退出
程序*/
elseprintf("
%d\n"
a+b);
/*打印输出A+B的
数值*/
}while
(1);
return0;
}
(2/5)
第二题:
谁是开门关门的人?
(10分)
每天第一个到机房的人要把门打开,最后一个离开
的人要把门关好。
现有一堆杂乱的机房签到、签离记录,请根
据记录找出当天开门和关门的人。
测试输入的第一行给出记录的总天数N(>
0)。
下面列出了N天的记录。
每天的记录在第一行给出记录的条目数M(>
0),下面是M
行,每行的格式为
证件号码签到时间签离时间
其中时间按“小时:
分钟:
秒钟”(各占2位)给出,证件号码
是长度不超过15的字符串。
对每一天的记录输出1行,即当天开门和关门人的
证件号码,中间用1空格分隔。
注意:
在裁判的标准测试输入中,所有记录保证完整,每个人
的签到时间在签离时间之前,
且没有多人同时签到或者签离的情况。
3
1
ME2532100:
00:
0023:
59:
59
EE30121808:
05:
3520:
56:
35
MA30113412:
35:
4521:
40:
423
CS30111115:
30:
2817:
10
SC302123408:
0011:
25:
25
CS30113321:
45:
0021:
58:
40
ME25321ME25321
EE301218MA301134
SC3021234CS301133
typedefstruct
charid[16];
/*证件号码长度不超过15位*/
charcometime[9];
/*时间格式00:
00*/
charleavetime[9];
}Record;
intmain()
intN,M,i;
/*记录的总天数N,每天记录的条目数M*/
Record*pTimeList;
/*记录该天出入人员的证件号码、进入
时间、离开时间*/
intfirst,last;
/*记录每天开门的人和关门的人*/
scanf("
%d"
N);
/*读入记录的总天数*/
while(N--)
&
M);
/*读入该天的进出人员数*/
pTimeList=(Record*)malloc(M*sizeof(Record));
for(i=0,first=0,last=0;
M;
%s%s%s"
pTimeList[i].id,
pTimeList[i]etime,pTimeList[i].leavetime);
if(i==0)
continue;
else
if(strcmp(pTimeList[first]etime,
pTimeList[i]etime)>
0)
first=i;
if(strcmp(pTimeList[last].leavetime,pTimeList[i].leavetime)<
0)last=i;
}/*fori*/
printf("
%s%s\n"
pTimeList[first].id,pTimeList[last].id);
free(pTimeList);
}/*forN*/
(3/5)
第三题:
分数统计(12分)
今天的上机考试虽然有实时的Ranklist,但上面的
排名只是根据完成的题数排序,没有考虑每题的分值,所以并
不是最后的排名。
给定录取分数线,请你写程序找出最后通过
分数线的考生,并将他们的成绩按降序打印。
测试输入包含若干场考试的信息。
每场考试信息的
第1行给出考生人数N(0<
N<
1000)、考题数M(0<
M<
=10)、分数线(正整数)G;
第2行排序给出第1题至第M题
的正整数分值;
以下N行,每行给出一名考生的准考证号(长
度不超过20的字符串)、该生解决的题目总数m、以及这m道
题的题号(题目号由1到M)。
当读入的考生人数为0时,输入结束,该场考试不予处理。
对每场考试,首先在第1行输出不低于分数线的考
生人数n,随后n行按分数从高到低输出上线考生的考号与分
数,其间用1空格分隔。
若有多名考生分数相同,则按他们考
号的升序输出。
4525
1010121315
CS0043513
CS003524135
CS002212
CS0013235
1240
1030
CS00112
2320101010
CS0000000000000000010
CS000000000000000002212
CS00360
CS00137
CS00437
CS00000000000000000220
charid[21];
/*准考证号(<
=20字符)*/
intscore;
/*该考生总分*/
}StuInfo;
intmain(){
intN,M,G,n;
/*考生人数,题目数,分数线,
上线考生数量*/
int*pMarkList;
/*第1题至第M题的正整数分值
*/
StuInfo*pStuinfo;
/*考生信息*/
inti,j,k,a,b,c,m;
/*临时变量*/
StuInfotmp;
/*用于排序*/
while(scanf("
N)&
N!
=0)/*读入考生人
数N*/
%d%d"
M,&
G);
/*读入题目
数量和分数线*/
pMarkList=(int
*)malloc(M*sizeof(int));
/*M道题目的分数*/
pStuinfo=(StuInfo
*)malloc(N*sizeof(StuInfo));
/*N个考生*/
(pMarkList[i]));
for(i=0,n=0;
N;
++i)/*读入N个考生
信息,i用于计数N次,cnt用于计算上线考生记录*/
%s%d"
(pStuinfo[n].id),
m);
/*准考证号,解出的题目数量m*/
for(pStuinfo[n].score=0,j=0;
j<
m;
++j)/*读入答出的m题的题号*/
a);
/*读入答对题的题号*/
pStuinfo[n].score+=
pMarkList[a-1];
/*因为题号是从1开始的;
计算该考生的
总分*/
if(pStuinfo[n].score>
=G)/*
如果考生上线则记录下来*/
n++;
/*否则不予记录,便于排序*/
for(i=0;
n-1;
++i)/*输入完毕,对上
线考生先按分数排序,降序*/
for(k=i,j=i+1;
n;
++j)
if(pStuinfo[j].score>
pStuinfo[k].score)
k=j;
tmp=pStuinfo[k];
pStuinfo[k]=pStuinfo[i];
pStuinfo[i]=tmp;
i+=k)/*相同总分考
生再按照准考证号排序*/
/*统计相同分数考生人数k*/
for(k=1,j=i+1;
if(pStuinfo[i].score==
pStuinfo[j].score)
k++;
/*下标i到i+k的考生分数相同,
对这k个考生排序,升序*/
for(a=i;
a<
=i+k-1;
a++)
for(c=a,b=a+1;
b<
=i+k;
b++)
if(strcmp(pStui
nfo[c].id,pStuinfo[b].id)>
0)
c=b;
tmp=pStuinfo[a];
pStuinfo[a]=
pStuinfo[c];
pStuinfo[c]=tmp;
输出,上线人数*/
准考证号和总分数*/
%s%d\n"
pStuinfo[i].id
pStuinfo[i].score);
free(pMarkList);
free(pStuinfo);
(4/5)
第四题:
最大连续子序列(13分)
给定K个整数的序列{N1,N2,...,NK},其任意
连续子序列可表示为{Ni,Ni+1,...,Nj},其中1<
=i<
=j
<
=K。
最大连续子序列是所有连续子序列中元素和最大的一个,
例如给定序列{-2,11,-4,13,-5,-2},其最大连续子序
列为{11,-4,13},最大和为20。
在今年的数据结构考卷中,
要求编写程序得到最大和,现在增加一个要求,即还需要输出
该子序列的第一个和最后一个元素。
测试输入包含若干测试用例,每个测试用例占2行,
第1行给出正整数K(<
10000),第2行给出K个整数,中间
用空格分隔。
当K为0时,输入结束,该用例不被处理。
对每个测试用例,在1行里输出最大和、最大连续
子序列的第一个和最后一个元素,中间用空格分隔。
如果最大
连续子序列不唯一,则输出序号i和j最小的那个(如输入样
例的第2、3组)。
若所有K个元素都是负数,则定义其最大和
为0,输出整个序列的首尾元素。
6
-211-413-5-2
-101234-5-2337-21
5-83250
-1-5-2
-10-2
201113
1014
1035
101010
0-1-2
000
intmain()
longintK,last;
/*输入数据个数K<
1000;
最大子序
列最后一个元素的下标last*/
longintThisSum,MaxSum,TmpMaxSum,index,*pList;
K)&
K)
MaxSum=TmpMaxSum=last=LONG_MIN;
pList=(longint*)malloc(K*sizeof(longint));
for(index=0;
index<
K;
index++)
scanf("
(pList[index]));
ThisSum+=pList[index];
if(ThisSum>
MaxSum)/*输入含有正数时,忽略最大
子序列中首尾0的影响*/
MaxSum=ThisSum;
/*更新MaxSum*/if(MaxSum>
TmpMaxSum)/*最大值更新时,更新
最大子序列最后的数字*/
{/*保证最大子序列起始位置在输入串的最前面
TmpMaxSum=MaxSum;
last=index;
}if(ThisSum<
0)ThisSum=0;
/*tracebacktofindfirstnumberofthemaxsubsequence*/
for(TmpMaxSum=0,index=last;
index>
=0;
index--)
TmpMaxSum+=pList[index];
if(TmpMaxSum==MaxSum)
if(MaxSum<
0)/*K个数字都是负数,定义最大和为0,
输出首尾元素*/
%ld%ld%ld\n"
0,pList[0],pList[K-1]);
MaxSum,pList[index],pList[last]);
free(pList);
(5/5)
第五题:
畅通工程(15分)
某省调查城镇交通状况,得到现有城镇道路统计表,
表中列出了每条道路直接连通的城镇。
省政府“畅通工程”的
目标是使全省任何两个城镇间都可以实现交通(但不一定有直
接的道路相连,只要互相间接通过道路可达即可)。
问最少还
需要建设多少条道路?
测试输入包含若干测试用例。
每个测试用例的第1
行给出两个正整数,分别是城镇数目N(<
1000)和道路数目
M;
随后的M行对应M条道路,每行给出一对正整数,分别是该
条道路直接连通的两个城镇的编号。
为简单起见,城镇从1到
N编号。
当N为0时,输入结束,该用例不被处理。
对每个测试用例,在1行里输出最少还需要建设的
道路数目。
13
43
33
12
23
52
12
35
9990
2
998
#include<
iostream>
vector>
usingnamespacestd;
intn,visited[1024];
vector<
int>
>
connect(1024,vector<
(1024));
intdfs(inta){
inti;
visited[a]=1;
for(i=1;
=n;
i++)
if(connect[a][i]==1&
visited[i]==0)dfs(i);
return(0);
intmain(intargc,char*argv[])
inti,j,a,b,count=-1;
intnumtown,numroad;
while(cin>
numtown&
numtown!
=0){cin>
numroad;
n=numtown;
=numtown;
for(j=1;
j++)
connect[i][j]=0;
for(i=1;
visited[i]=0;
=numroad;
cin»
a»
b;
connect[a][b]=connect[b][a]=1;
for(j=1;
if(visited[i]==0)
dfs(i);
count++;
cout<
count<
endl;
2006年浙江大学计算机学院考研复试上机试题及参考答案
A+B(16分)
读入两个小于10000的正整数A和B,计算A+B。
需
要注意的是:
如果A和B的末尾K(不超过8)位数字相同,请
直接输出-1。
ABK"
,相邻两数字有一个空格间隔。
当A和B同时为
0时输入结束,相应的结果不要输出。
对每个测试用例输出1行,即A+B的值或者是-1
I21
II211
10882
36643
001
-1
100
unsignedinta,b,k;
unsignedcharch1[50],ch2[50];
%d%d%d"
a,&
b,&
k);
if(a==0&
b==0||k>
8)break;
sprintf(ch1,"
a);
sprintf(ch2,"
b);
strrev(ch1);
strrev(ch2);
if(strlen(ch1)<
k)strncat(ch1+strlen(ch1)-1,"
0000000
0"
8);
if(strlen(ch2)<
k)strncat(ch2+strlen(ch2)-1,"
00000000"
if(strncmp(ch1,ch2,k)==0)
-1);
a+b);
大中小
统计同成绩学生人数(12分)
读入N名学生的成绩,将获得某一给定分数的学生
人数输出。
测试输入包含若干测试用例,每个测试用例的格式
为
第1行:
N
第2行:
N名学生的成绩,相邻两数字用一个空格间隔。
第3行:
给定分数
当读到N=0时输入结束。
其中N不超过1000,成绩分数为(包
含)0到100之间的一个整数。
对每个测试用例,将获得给定分数的学生人数输出。
806090
60
85660
5
6075905575
75
unsignedN,score,num,i;
unsignedpList[1000];
do
N);
if(N==0)break;
i++)scanf("
pList[i]);
score);
for(num=0,i=0;
i++)if(p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 浙大 计算机 学院 考研 复试 上机 试题 参考答案