-
浙江大学计算机复试上机
2005-2007
(由林子整理
:
170479150
)
p>
?
2005<
/p>
年浙江大学计算机学院考研复试上机试题及参考答案
(1/5)
第一题:
A+B(10
分
)
[
结题
]
题
目要求:读入两个小于
100
的正整数
A
和
B
,计算
A+B
。
需要注意的是:
A
和
B
的每一位数字由对
应的英文单词给出。
输入格式:
测试
输入包含若干测试用例,
每个测试用例占一行,
格式为
,相邻两字符串有一个空格间隔。当
A
和
B
同时为
0
时输入结束,相应的结果不要输出。
输出格式
:对每个测试用例输出
1
行,即
A+B
的值。
输入样例:
one + two =
three four + five six =
zero
seven + eight nine =
zero + zero
=
输出样例:
3
90
96
#include
#include
#include
#include
int main(void)
{
const char data[12][6] =
{
unsigned a, b; /*
转换后的表达式参数
,
如
a+b(123+456) */
unsigned i, j, k; /*
临时变量,作为下标
*/
char str[100]; /*
输入字符串,足够大容量
*/
char temp[6]; /*
临时字符串,用于检索数字,如
char result[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
,因
为有空格
*/
天的记录。 <
br> */ 题
M
。在今
<
br>输入格式: <
br>2 <
br> 1 和 (不超过 <
br>
<
br>第
<
br>=========================
<
br>如果放到 */ <
br>如果放到 */
for(i=0, k=0; i
{
for(j=0;!isspace
(str[i])&&i
i,++j) /*
提取一个单词
*/
temp[j] = str[i];
temp[j] = 0; /*
字符串结束标记
*/
for(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[k] = 0; /*
p>
字符串结束标记,
result
形式
sscanf(result,
用
sscanf
来获得
a,b
的值
*/
if(
a==0 && b==0 ) break; /*
A,B
同时为零则
退出程序
*/
else
printf(
a
+
b); /*
打印输出
A
+
B
的数值
*/
}while(1);
return 0;
}
?
p>
2005
年浙江大学计算机学院考研复试上机试题及参考答案
(2/5)
第
二题:谁是开门关门的人?(
10
分)
题目要求:每天第一个到机房的人要把门打开,最后一个离开
的
人要把门关好。现有一堆杂乱的机房签到、签离记录,请根
据记录找出当天开门和关门的
人。
输入格式:测试输入的第一行给出记录的总天数
N ( > 0
)
。
下面列出了
N
每天的记录在第一行给出记录的条目数
M ( > 0 )
p>
,下面是
M
行,每行的格式为
证件号码
签到时间
签离时间
其中时间按“小时
:
分钟
:
秒钟”(各占
2
位)给出,证件号码
是长度不超过<
/p>
15
的字符串。
输出格式:对每一天的记录输出
1
行,即当天开门和关门人的
证件号码,中间用
1
空格分隔。
注意:在裁判的标准测试输入中,所有记录保证完整,每个人
的签到时间在签离时间之前,
且没有多人同时签到或者签离的情况。
输入样例:
3
1
ME3 00:00:00 23:59:59
2
EE301218 08:05:35 20:56:35
MA301134 12:35:45 21:40:42
3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40
输出样例:
ME3 ME3
EE301218 MA301134
SC3021234
CS301133
#include
#include
#include
typedef struct
{
char id[16]; /*
证件号码长度不超过
p>
15
位
*/
char cometime[9]; /*
时间格式
00:00:00 */
char leavetime[9]; /*
时间格式
00:00:00 */
}Record;
int
main()
{
int
N,
M,
i; /*
记录的总天数
p>
N
,每天记录的条目数
M
*/
Record *pTimeList;/*
记录该天出入人员的证件号码、
进入时间、离开时间
int first, last; /*
记录每天开门的人和关门的人
*/
scanf(
读入记录的总天数
*/
while(N--)
{
scanf(
读入该天的进出人员数
*/
pTimeList = (Record
*)malloc(M*sizeof(Record));
for(i=0,first=0,last=0; i
{
scanf(
pTimeList[i].cometime,
pTimeList[i].leavetime);
if(i==0)
continue;
else
{
if( strcmp(
pTimeList[first].cometime,
pTimeList[i].cometime ) > 0 )
first = i;
if(
strcmp( pTimeList[last].leavetime,
pTimeList[i].leavetime) < 0)
last = i;
}
} /* for i */
printf(
pTimeList[last].id);
free(pTimeList);
} /* for N */
}
?
200
5
年浙江大学计算机学院考研复试上机试题及参考答案
(3/5
)
第三题:分数统计(
12
分)
题目要求:
今天的上机考试虽然有实时的
Ranklist
,但上面
的排名只是根据完成的题数排序,没有考虑每题的分值,所以
并不是最
后的排名。给定录取分数线,请你写程序找出最后通
过分数线的考生,并将他们的成绩按
降序打印。
输入格式:测试输入包含若干场考试的信息。每场
考试信息的
第
1
行给出考生人数
N ( 0 < N < 1000
)
、考题数
M ( 0
< M <
= 10)
、分数线(正整数)
G
;第
2
行排序给出第
1
至第
M
题的正整数分值;以下<
/p>
N
行,每行给出一名考生的准考
证号(长
度不超过
20
的字符串)、该生解决的题目总数
m
、以
及这
m
道题的题号(题目号由
1
到
M
)。
当读入的考生人数为
0
时,输入结束,该场考试不予处理。
输出格式:对每场考试,首先在第
1
行输出不低
于分数线的考
生人数
n
,随后
n
行按分数从高到低输出上线考生的考号与分
数
,其间用
1
空格分隔。若有多名考生分数相同,则按他们考
p>
号的升序输出。
输入样例:
4 5 25
10 10 12 13 15
CS004 3 5 1 3
CS003 5 2 4 1 3 5
CS002 2 1
2
CS001 3 2 3 5
1 2 40
10 30
CS001 1 2
2
3 20
10 10 10
CS000001 0
CS000002 2 1 2
0
输出样例:
3
CS003 60
CS001 37
CS004 37
0
1
CS000002 20
#include
#include
#include
typedef struct
{
char id[21]; /*
准考证号
(<=20
字符
) */
int
score; /*
该考生总分
*/
}StuInfo;
int
main()
{
int N, M, G, n;
/*
考生人数,题目数,分数线,
上线考生数量
*/
int
*pMarkList;
/*
第
1
题至第
题的正整数分值
*/
StuInfo *pStuinfo; /*
考生信息
*/
int
i,j,k,a,b,c,m; /*
临时变量
*/
StuInfo tmp; /*
用于排序
*/
while(
scanf(
读入考
生人数
N */
{
scanf(
&M,
&G); /*
读入题目数量
和分数线
*/
pMarkList = (int
*)malloc(M*sizeof(int)); /*
M
道题目的分数
*/
pStuinfo = (StuInfo
*)malloc(N*sizeof(StuInfo)); /*
N
个考生
*/
for(i=0;
i
++i) /*
读入
M
题每题分数
*/
scanf(
for(i=0, n=0;
i
读入
N
个
考生
信息,
i
用于计数
N
次,
cnt
用于计算上线考
生记录
*/
{
scanf(
&m);/*
准考证号,解出的题目数量
m */
for(pStuinfo[n].score=0,j=0; j
++j)
/*
读入答出的
m
题的题号
*/
{
scanf(
读入答对
题的题号
*/
pStuinfo[n].score +=
pMarkList[ a-1 ]; /*
因为题号是从<
/p>
1
开始的;计算该
考生的总分
*/
}
if(pStuinfo[n].score >= G)
/*
如果
考生上线则记录下来
*/
n++;
/*
否
则不予记录,便于排序
*/
}
for(i=0; i
输入完毕,对上线
考生先按分数排序,降序
*/
{
for(k=i, j=i+1; j
if(pStuinfo[j].score >
pStuinfo[k].score)
k = j;
tmp =
pStuinfo[k];
pStuinfo[k] =
pStuinfo[i];
pStuinfo[i] =
tmp;
}
for(i=0; i
相同总分考生再
按照准考证号排序
*/
{
/*
统计相同分数考生人数
k */
for(k=1,j=i+1; j
{
if(pStuinfo[i].score ==
pStuinfo[j].score)
k++;
else
break;
}
/*
下标
i
到
i+k
的考生分数相同,
对这
k
个
考生排序,升
序
*/
for(a=i;
a<=i+k-1; a++)
{
for(c=a, b=a+1; b<=i+k;
b++)
if(strcmp(pStuinfo[c].id,
pStuinfo[b].id) > 0)
c = b;
tmp =
pStuinfo[a];
pStuinfo[a] = pStuinfo[c];
pStuinfo[c] = tmp;
}
}
printf(
排序完毕,按照要求输
出,上线人数
*/
for(i=0; i
和每个上线考生的准
考证号和总分数
*/
printf(
Stuinfo[i].score);
free(pMarkList);
free(pStuinfo);
}
return 0;
}
?
2005
年浙江大学计算机学院考研复试上机试题及参考答案
(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<
/p>
行给出正整数
K( < 10000)
,
第
2
行给出
K
个整数,中
间用空格分隔。当
K
为
p>
0
时,输入结束,该用例不被处理。
p>
输出格式:对每个测试用例,在
1
行里输出
最大和、最大连续
子序列的第一个和最后一个元素,中间用空格分隔。如果最大
连续子序列不唯一,则输出序号
i
和
j
最小的那个(如输入样
例的第
、
3
组)。若所有
K
个元素都是负数,则定义其最大
和为
0
,输出整个序列的首尾元素。
输入样例:
6
-2 11 -4 13 -5 -2
10
-10 1 2 3 4 -5 -23 3 7 -21
6
5 -8 3 2 5 0
1
10
3
-1 -5 -2
3
-1 0 -2
0
输出样例:
20 11 13
10 1 4
10 3 5
10
10 10
0 -1 -2
0 0
0
#include
#include
#include
int main()
{
long
int
K,
last; /*
输入数据
个数
K<1000
;最大子
序列最后一
个元素的下标
last */
long int
ThisSum, MaxSum, TmpMaxSum, index,
*pList;
while(
scanf(
{
ThisSum = 0;
MaxSum = TmpMaxSum = last = LONG_MIN;
pList = (long int *)malloc( K *
sizeof(long
int) );
for(index = 0; index < K; index++)
{
scanf(
ThisSum += pList[index];
if(ThisSum > MaxSum) /*
输
入含有正数时,忽略最
大子序列中首尾
0
的影响
*/
{
MaxSum = ThisSum;/*
更新
MaxSum
*/
if( MaxSum > TmpMaxSum ) /*
最大值更新时,更
新最大子序列最后的数字
*/
{ /*
保证最大子序列起始位置在输入串的最前面
*/
TmpMaxSum = MaxSum;
last = index;
}
}
if( ThisSum < 0 )
ThisSum = 0;
}
/*
trace
back
to
find
first
number
of
the
max
subsequence */
for(
TmpMaxSum
=
0,
index
=
last;
index
>=
0;
index-- )
{
TmpMaxSum += pList[index];
if(TmpMaxSum == MaxSum)
break;
}
if( MaxSum
< 0 ) /* K
个数字都是负数,定义最大和
为
0
,输出首尾元素
*/
printf(
pList[K-1]);
else
printf(
%ld
%ldn
MaxSum,
pList[index],
pList[last]
);
free(pList);
}
return 0;
}
?
200
5
年浙江大学计算机学院考研复试上机试题及参考答案
(5/5
)
第
五题:畅通工程(
15
分)
题目要求:
某省调查城镇交通状况,
得到现有城
镇道路统计表,
表中列出了每条道路直接连通的城镇。省政府“畅通工程”的
目标是使全省任何两个城镇间都可以实现交通(但不一定有直
接的道路相连
,只要互相间接通过道路可达即可)。问最少还
需要建设多少条道路?
输入格式:测试输入包含若干测试用例。每个测试用例的第
行给出两个正整数,分别是城镇数目
N ( <
1000 )
和道路数
目
M
;随后的
M
行对应
M
p>
条道路,每行给出一对正整数,分别
是该条道路直接连通的两个城镇
的编号。为简单起见,城镇从
1
到
N<
/p>
编号。当
N
为
0
时,输入结束,该用例不被处理。
输
出格式:对每个测试用例,在
1
行里输出最少还需要建设的
p>
道路数目。
输入样例:
4 2
1 3
4 3
3 3
1 2
2 3
5 2
1 2
3 5
999 0
0
输出样例:
1
0
2
998
#include
#include
using
namespace std;
int n,
visited[1024];
vector
connect(1024,vector
int dfs(int a)
{
int i;
visited[a]=1;
for(i=1;i<=n;i++)
if
(connect[a][i]==1 && visited[i]==0)
dfs(i);
return(0);
}
int main(int
argc, char* argv[])
{
int
i,j,a,b,count = -1;
int
numtown,numroad;
while(cin>>numtown && numtown!=0){
cin>>numroad;
n = numtown;
for(i=1;i<=numtown;i++)
for(j=1;j<=numtown;j++)
connect[i][j] = 0;
for(i=1;i<=numtown;i++)
visited[i] =
0;
for(i=1;i<=numroad;i++)
{
cin>>a>>b;
connect[a][b] = connect[b][a] = 1;
}
for(j=1;j<=numtown;j++)
connect[i][j] = 0;
for(i=1;i<=numtown;i++)
visited[i] =
0;
for(i=1;i<=numroad;i++)
{
cin>>a>>b;
connect[a][b] = connect[b][a] = 1;
}
for(i=1;i<=numtown;i++)
if
(visited[i]==0)
{
dfs(i);
count++;
}
cout<
}
return 0;
}
2006
年浙江大学计算机学院考研复试上机试题及参考答案
(1/5)
第一题:
A+B(16
分
)
题目要求:读入两个
小于
10000
的正整数
A
和
B
,计算
A+B
。
需要注意的是:如果
A
B
的末尾
K
8
)位数字相同,
请直接
输出
-1
。
输入格式:
测试输入包含若干测试用例,
每个测试用例占一行,
格式为
B
K
,相邻两数字有一个空格间隔。当
A
和
B
同时
为
0<
/p>
时输入结束,相应的结果不要输出。
输
出格式:对每个测试用例输出
1
行,即
A+B
的值或者是
-1
。
输入样例:
1 2 1
11 21 1
108 8 2
36 64 3
0 0 1
?
输出样例:
3
-1
-1
100
#include
#include
int main(void)
{
unsigned int a, b, k;
unsigned char ch1[50],
ch2[50];
do{
scanf(
if( a==0&&b==0 || k>8 )
break;
sprintf(ch1,
a);
sprintf(ch2,
b);
strrev(ch1);strrev(ch2);
i
f(strlen(ch1)
if(strlen(ch2)
if(strncmp(ch1,ch2,k)==0)
printf(
else
printf(
}while(1);
return 0;
}
?
2006
年浙江大学计算机学院考研复试上机试题及参考答案
(2/5)
2007-03-31
21:44:14
大
中
小
第二题:统计同成绩学生人数(
12
分)
题目要求:读入
N
名学生的成绩,将获得某一给定分数的学生
人数输出
。
输入格式:测试输入包含若干测试用例,每个测试用例的格
式
为
第
1
行:
N
第
2
行:
N<
/p>
名学生的成绩,相邻两数字用一个空格间隔。
3
行:给定分数
当读到
N=0
时输入结束。
其中
N
不超过
1000
,
成绩分数为
(包
含)
p>
0
到
100
之间的
一个整数。
输出格式:
对每个测试用
例,
将获得给定分数的学生人数输出。
输入样例:
3
80 60 90
60
2
85 66
0
5
60 75 90 55 75
75
0
输出样例:
1
0
2
#include
#include
int main(void)
{
unsigned N, score, num, i;
unsigned pList[1000];
do
{
scanf(
if(N==0) break;
for(i=0;i
scanf(
for(num=0,i=0;i
num++;
printf(
}while(1);
return 0;
}
?
2006
年浙江大学计算机学院考研复试上机试题及参考答案
(3/5)
第三题:火星
A+B
(
7
分)(
ZOJ ACM
2529
)
题目要求:读入两个不超
过
25
位的火星正整数
A
和
B
,计算
A+B
。需要注意的是:在火星上,整数不是单一进制的,第
n
位的进制就是第
n
个素数。例如:地球上的
10
进制数
2
,在
火星上记为“
1,0
”,因为火星个位数是<
/p>
2
进制的;地球上的
10
进制数
38
,在火星上记为“
1,1,1,0
”,因为火星个位数
是
2
进制的,十位数是
3
进制的,百位数
是
5
进制的,千位数
是
7
进制的??
输入格式:<
/p>
测试输入包含若干测试用例,
每个测试用例占一行,
包含两个火星正整数
A
和
B
,火星整数的相邻两位数用逗号分
隔,
A
和
B
之间有一个空格间隔。当
A
或
B
为
0
时输入结束,
相应的结果不要输出。
输出格式:
对每个测试用例输出
1
行,
即火星表示法的
A+B
的
值。
输入样例:
1,0 2,1
4,2,0 1,2,0
1 10,6,4,2,1
0 0
输出样例:
1,0,1
1,1,1,0
1,0,0,0,0,0
我的代码
=============================
测试用例和输出结果:
1,0
2,1
1,0,1
4,2,0 1,2,0
1,1,1,0
1 10,6,4,2,1
1,0,0,0,0,0
0,1,0,1 0,0,1,1
1,2,0
0,0,0,0,1 1,0,0
1,0,1
0,0,0,1 0,0,0,0,0,1
1,0
96,88,82,78,72,70,66,60,
58,52,46,42,40,36,30,
28,22,18,16,12,10,
6,4,2,1 96,88,82,
78,72,70,66,60,58,52,
46,42,40,36,30,28,22,18,
16,12,10,6,4,2,
1
1,96,88,82,78,72,70,66,60,58,52,46,42
,40,36,3
0,28,22,18,16,12,10,6,4,2,0
0,0,0 0,1,0
Press any key to
continue
#include
#include
#include
#define N 25
int
IsPrime(int n)
{
int i;
if(n<2) return 0;
for(i=2;
i
if(n%i==0) return 0;
return 1;
}
int main(void)
{
char op1[300], op2[300], *p;
int
i,
j,
index,
num,
num1,
num2,
cnt,
breakflag;
int PrimeList[N+1], op1List[N], op2List[N],
OutputList[N+1];
for(i = 0, j = 0; i < N+1; j++) /*
计算每一位
的进制
*/
if(IsPrime(j)) PrimeList[i++] =
j;
do
{
if(scanf(
break;
for(i=0; i
OutputList[i]
=
op1List[i]
=
op2List[i]
=
0;
OutputList[N] =
0;
num1
=
0;
breakflag
=
1;
p
=
strtok(op1,
while(p) /*
求出第一个输入火星数的数组
*/
{
if( ( op1List[num1++] = atoi(p) )
!= 0)
breakflag = 0;
p = strtok(NULL,
}
if(breakflag)
break;
/*
第一个输入为
0
,退出循环;
ZOJ2529
,删除本行
num2
=
0;
breakflag
=
1;
p
=
strtok(op2,
while(p) /*
求出第二个输入火星数的数组
*/
{
if( ( op2List[num2++] = atoi(p) )
!= 0)
breakflag =0;
p
= strtok(NULL,
}
if(breakflag)
break;
/*
第二个输入为
0
,退出循环;
ZOJ2529
,删除本行
num1--,num2--; /*
preset num1 and num2 start
from zero
*/
-
-
-
-
-
-
-
-
-
上一篇:浙大各专业课名称代码
下一篇:浙大计算机学院考研复试上机试题及参考答案