首页 热点专区 小学知识 中学知识 出国留学 考研考公
您的当前位置:首页正文

浙大计算机学院考研复试上机试题

2020-10-01 来源:要发发知识网


浙江大学计算机复试上机2005-2007 (由林子整理 QQ:170479150)

2005年浙江大学计算机学院考研复试上机试题及参考答案(1/5) 第一题:A+B(10分) [结题]

题目要求:读入两个小于100的正整数A和B,计算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] = {\"zero\\"one\\"two\\"four\ \"five\ unsigned a, b; /* 转换后的表达式参数,如a+b(123+456) */ unsigned i, j, k; /* 临时变量,作为下标 */

char str[100]; /* 输入字符串,足够大容量 */

char temp[6]; /* 临时字符串,用于检索数字,如\"one\"->'1' */ char result[30]; /* 转换后的表达式参数,如\"123+456=\" */ 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; ifor(j=0;!isspace(str[i])&&itemp[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; /* 字符串结束标记,result形式\"123+456=\" */

sscanf(result,\"%d+%d=\用sscanf来获得a,b的值 */ if( a==0 && b==0 ) break; /* A,B同时为零则退出程序 */

else printf(\"%d\\n\打印输出 A + B 的数值 */ }while(1); return 0; }

2005年浙江大学计算机学院考研复试上机试题及参考答案(2/5) 第二题:谁是开门关门的人?(10分)

题目要求:每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签到、签离记录,请根据记录找出当天开门和关门的人。

输入格式:测试输入的第一行给出记录的总天数N ( > 0 )。下面列出了N天的记录。

每天的记录在第一行给出记录的条目数M ( > 0 ),下面是M行,每行的格式为 证件号码 签到时间 签离时间

其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。

输出格式:对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。

注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,

且没有多人同时签到或者签离的情况。 输入样例: 3 1

ME3021112225321 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 输出样例:

ME3021112225321 ME3021112225321 EE301218 MA301134 SC3021234 CS301133 #include #include #include typedef struct {

char id[16]; /* 证件号码长度不超过15位 */ char cometime[9]; /* 时间格式00:00:00 */ char leavetime[9]; /* 时间格式00:00:00 */ }Record; int main() {

int N, M, i; /* 记录的总天数N,每天记录的条目数M */

Record *pTimeList;/* 记录该天出入人员的证件号码、进入时间、离开时间 */ int first, last; /* 记录每天开门的人和关门的人 */

scanf(\"%d\读入记录的总天数 */ while(N--) {

scanf(\"%d\读入该天的进出人员数 */ pTimeList = (Record *)malloc(M*sizeof(Record));

for(i=0,first=0,last=0; iscanf(\"%s%s%s\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(\"%s %s\\n\ free(pTimeList); } /* for N */ }

2005年浙江大学计算机学院考研复试上机试题及参考答案(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空格分隔。若有多名考生分数相同,则按他们考号的升序输出。

输入样例: 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

CS000000000000000001 0

CS000000000000000002 2 1 2 0

输出样例: 3

CS003 60 CS001 37 CS004 37 0 1

CS000000000000000002 20 #include #include #include typedef struct {

char id[21]; /* 准考证号(<=20字符) */ int score; /* 该考生总分 */ }StuInfo; int main() {

int N, M, G, n; /* 考生人数,题目数,分数线,上线考生数量 */ int *pMarkList; /* 第1题至第M题的正整数分值 */ StuInfo *pStuinfo; /* 考生信息 */

int i,j,k,a,b,c,m; /* 临时变量 */ StuInfo tmp; /* 用于排序 */

while( scanf(\"%d\读入考生人数N */ {

scanf(\"%d%d\读入题目数量和分数线 */ pMarkList = (int *)malloc(M*sizeof(int)); /* M道题目的分数 */

pStuinfo = (StuInfo *)malloc(N*sizeof(StuInfo)); /* N个考生 */

for(i=0; ifor(i=0, n=0; iscanf(\"%s%d\& (pStuinfo[n].id), &m);/* 准考证号,解出的题目数量m */

for(pStuinfo[n].score=0,j=0; jscanf(\"%d\读入答对题的题号 */ pStuinfo[n].score += pMarkList[ a-1 ]; /* 因为题号是从1开始的;计算该考生的总分 */ }

if(pStuinfo[n].score >= G) /* 如果考生上线则记录下来 */ n++; /* 否则不予记录,便于排序 */

}

for(i=0; i{

for(k=i, j=i+1; jif(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; jif(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(\"%d\\n\排序完毕,按照要求输出,上线人数 */ for(i=0; ifree(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行给出正整数K( < 10000),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。

输出格式:对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、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(\"%d\ {

ThisSum = 0;

MaxSum = TmpMaxSum = last = LONG_MIN;

pList = (long int *)malloc( K * sizeof(long int) ); for(index = 0; index < K; index++) {

scanf( \"%d\ 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(\"%ld %ld %ld\\n\ else

printf(\"%ld %ld %ld\\n\ free(pList); }

return 0; }

2005年浙江大学计算机学院考研复试上机试题及参考答案(5/5)

第五题:畅通工程(15分)

题目要求:某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

输入格式:测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。当N为0时,输入结束,该用例不被处理。

输出格式:对每个测试用例,在1行里输出最少还需要建设的道路数目。 输入样例: 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(1024)); 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。

输入格式:测试输入包含若干测试用例,每个测试用例占一行,格式为\"A B K\",相邻两数字有一个空格间隔。当A和B同时为0时输入结束,相应的结果不要输出。

输出格式:对每个测试用例输出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(\"%d %d %d\ if( a==0&&b==0 || k>8 ) break;

sprintf(ch1, \"%d\ strrev(ch1);strrev(ch2);

if(strlen(ch1)printf(\"%d\\n\ }while(1); return 0; }

2006年浙江大学计算机学院考研复试上机试题及参考答案(2/5)

2007-03-31 21:44:14 大 中 小

第二题:统计同成绩学生人数(12分)

题目要求:读入N名学生的成绩,将获得某一给定分数的学生人数输出。 输入格式:测试输入包含若干测试用例,每个测试用例的格式为 第1行:N

第2行:N名学生的成绩,相邻两数字用一个空格间隔。 第3行:给定分数

当读到N=0时输入结束。其中N不超过1000,成绩分数为(包含)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(\"%d\ if(N==0) break;

for(i=0;ifor(num=0,i=0;iprintf(\"%d\\n\ }while(1); return 0; }

2006年浙江大学计算机学院考研复试上机试题及参考答案(3/5) 第三题:火星A+B (7分)(ZOJ ACM 2529)

题目要求:读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的„„

输入格式:测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数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,30,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; iint 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(\"%s%s\ break;

for(i=0; iOutputList[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 */ if(num1 < num2) /* 把输入的两个火星数数按位序对齐,两个if操作只执行一个 */

for(i = num1; i >= 0; --i) {

op1List[i + num2 - num1] = op1List[i]; op1List[i] = 0; }

if(num1 > num2)

for(i = num2; i >= 0; --i) {

op2List[ i + num1 - num2] = op2List[i]; op2List[i] = 0; }

cnt = (num1 > num2) ? num1 : num2; /* cnt为两个火星数的较大位数,便于确定输出位数 */

for( index=0, i=cnt; i>=0 ; i--, index++ ) {

num = op1List[i] + op2List[i] + OutputList[index]; if( num - PrimeList[index] >= 0 ) {

OutputList[index] = num - PrimeList[index]; OutputList[index+1]++;

if( index + 1 > cnt ) cnt++; /* 最高位进位 */ } else

OutputList[index] = num; }

while( OutputList[cnt]==0 && cnt ) cnt--; /* omit leading zeros */

for( ; cnt >=0 ; cnt-- )

printf(\"%d%c\ }while(1); return 0; }

2006年浙江大学计算机学院考研复试上机试题及参考答案(4/5) 第4题:简单计算器(7分)

题目要求:读入一个只包含 +, -, *, / 的正整数计算表达式,计算该表达式的值。

输入格式:测试输入包含若干测试用例,每个测试用例占一行,每行不超过80个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

输出格式:对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。 输入样例: 1 + 2

4 + 2 * 5 - 7 / 11 0

输出样例: 3.00 13.36

#include #include #include #include #define EmptyStack (-1) typedef float ElementType; typedef struct StackRecord {

int Capacity; int TopOfStack;

ElementType *Array; }*Stack;

Stack CreateStack(int StackSize) {

Stack S

S = (Stack)malloc(sizeof(struct StackRecord)); S->Capacity = StackSize; S->TopOfStack = EmptyStack; S->Array =

(ElementType*)malloc(sizeof(ElementType)*StackSize); return S; }

void DisposeStack(Stack S) {

if(S!=NULL) /* be aware of order ! */ {

free(S->Array); free(S); } }

/* if stack is empty, return 1 */ int IsEmpty(Stack S) {

return S->TopOfStack == EmptyStack; }

/* if stack is full, return 1 */ int IsFull(Stack S) {

return S->TopOfStack >= S->Capacity; }

void Push(ElementType X, Stack S) {

if(IsFull(S))

printf(\"Stack is full ! \\n\"); else

S->Array[++S->TopOfStack] = X; }

ElementType Pop(Stack S) {

if(IsEmpty(S)) {

printf(\"Stack is empty ! \\n\"); return 0; }

return S->Array[S->TopOfStack --]; }

ElementType Top(Stack S) {

if(IsEmpty(S)) {

printf(\"Stack is empty ! \\n\"); return 0; }

else

return S->Array[S->TopOfStack]; }

#define NUM 1 #define OPRAND 0 #define UNKNOWN -1 struct List {

int type; char opcode; float operand; };

int main(void) {

unsigned char str[81]; /* index */ unsigned int num, p, index; float operand1,operand2;

struct List pList[100]; /* p */ Stack S;

do{

/* get input expression */ gets(str);

if(strcmp(str,\"0\")==0) break; /* initialize */

S = CreateStack(100); num = p = index = 0;

for(index=0;index<100;index++) {

pList[index].type = UNKNOWN; pList[index].opcode = 0; pList[index].operand = 0; }

/* create postfix */

for(index=0;index/* create number */

if(isdigit(str[index])) num = num*10 + str[index] - '0';

else num = 0;

/* save number */

if(isdigit(str[index])&&(!isdigit(str[index+1]))) {

pList[p].type = NUM;

pList[p].operand = (float)num; p++; }

/* push operand */

if(str[index]=='*'||str[index]=='/') {

while(!IsEmpty(S) && (Top(S)=='*' || Top(S)=='/'))

{

pList[p].type = OPRAND;

pList[p].opcode = (char)Pop(S); p++; }

Push(str[index],S); }

if(str[index]=='+'||str[index]=='-') {

while(!IsEmpty(S)) {

pList[p].type = OPRAND;

pList[p].opcode = (char)Pop(S); p++; }

Push(str[index], S); } }

while(!IsEmpty(S)) {

pList[p].type = OPRAND;

pList[p].opcode = (char)Pop(S); p++; }

/* calc postfix */

for(p=0; pList[p].type!=UNKNOWN; p++) {

if(pList[p].type == NUM)

Push(pList[p].operand, S);

else if(pList[p].type == OPRAND) {

operand2 = Pop(S); operand1 = Pop(S);

switch(pList[p].opcode) {

case '+' : Push( operand1 + operand2, S); break; case '-' : Push( operand1 - operand2, S); break; case '*' : Push( operand1 * operand2, S); break; case '/' : Push( operand1 / operand2, S); break; } } }

printf(\"%.2f\\n\ DisposeStack(S); }while(1); return 0; }

2006年浙江大学计算机学院考研复试上机试题及参考答案(5/5) 第5题:畅通工程 (8分) [prim算法,最小生成树]

题目要求:某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。

输入格式:测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。当N为0时,输入结束,该用例不被处理。

输出格式:对每个测试用例,在1行里输出最小的公路总长度。

输入样例: 3

1 2 1 1 3 2 2 3 4 4

1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0

输出样例: 3 5

#include using namespace std; #define MAXN 110

#define inf 1000000000

int prim(int n,int mat[][MAXN]) {

int min[MAXN],ret=0; int v[MAXN],i,j,k; for (i=0;ifor (min[j=0]=0;jfor (k=-1,i=0;iif (!v[i]&&(k==-1||min[i]for (v[k]=1,ret+=min[k],i=0;ireturn ret; }

int main() {

int n,d[MAXN][MAXN],a,b,c; while(cin>>n&&n) {

for(int i=n*(n-1)/2;i;--i) {

cin>>a>>b>>c;

d[a-1][b-1]=d[b-1][a-1]=c; }

cout<return 0; }

2007年浙江大学计算机学院考研复试上机试题及参考答案(1/6) 标题:● 2007考研上机考试题目1--最小长方形(35分) Time limit: 1 Seconds

Total Submit: 1216 Accepted Submit: 210

题目要求:给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内。长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内。

具体的输入输出格式规定如下:

输入格式:测试输入包含若干测试用例,每个测试用例由一系列坐标组成,每对坐标占一行,其中|x|和|y|小于 231;一对0 坐标标志着一个测试用例的结束。注意(0, 0)不作为任何一个测试用例里面的点。一个没有点的测试用例标志着整个输入的结束。

输出格式:对每个测试用例,在1行内输出2对整数,其间用一个空格隔开。第1对整数是长方形框左下角的坐标,第2对整数是长方形框右上角的坐标。 输入样例: 12 56 23 56 13 10 0 0 12 34 0 0 0 0

输出样例: 12 10 23 56 12 34 12 34

#include using namespace std; int main() {

int x1,y1,x2,y2,x,y;

while(cin>>x>>y&&(x||y)){ x1=x2=x; y1=y2=y;

while(cin>>x>>y&&(x||y))

x1=x1x?x2:x,y2=y2>y?y2:y;

cout<return 0; }

2007年浙江大学计算机学院考研复试上机试题及参考答案(2/6) ● 2007考研上机考试题目2--统计字符(25分)

Time limit: 1 Seconds

Total Submit: 820 Accepted Submit: 199 题目要求:统计一个给定字符串中指定的字符出现的次数 具体的输入输出格式规定如下:

输入格式:测试输入包含若干测试用例,每个测试用例包含2行,第1行为一个长度不超过5的字符串,第2行为一个长度不超过80的字符串。注意这里的字符串包含空格,即空格也可能是要求被统计的字符之一。当读到'#'时输入结束,相应的结果不要输出。

输出格式:对每个测试用例,统计第1行中字符串的每个字符在第2行字符串中出现的次数,按如下格式输出: c0 n0 c1 n1

c2 n2 ...

其中ci是第1行中第i个字符,ni是ci出现的次数。 输入样例: I

THIS IS A TEST i ng

this is a long test string #

输出样例: I 2 i 3 5 n 2 g 2

注:第2个测试用例中,空格也是被统计的字符之一。

#include #include using namespace std; int main() {

string pat,line;

while(getline(cin,pat)&&pat!=\"#\"){ int co[5]={0,0,0,0,0}; getline(cin,line);

for(int i=0,j;ifor(j=0;jfor(int i=0;icout<return 0; }

2007年浙江大学计算机学院考研复试上机试题及参考答案(3/6) ● 2007考研上机考试题目3--游船出租(18分)

Time limit: 1 Seconds

Total Submit: 706 Accepted Submit: 84

题目要求:现有公园游船租赁处请你编写一个租船管理系统。当游客租船时,管理员输入船号并按下S键,系统开始计时;当游客还船时,管理员输入船号并按下E键,系统结束计时。船号为不超过100的正整数。当管理员将0作为船号输入时,表示一天租船工作结束,系统应输出当天的游客租船次数和平均租船时间。

注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有租船没有还船,或者只有还船没有租船的纪录,系统应能自动忽略这种无效纪录。

具体的输入输出格式规定如下:

输入格式:测试输入包含若干测试用例,每个测试用例为一整天的租船纪录,格式为 船号(1~100) 键值(S或E) 发生时间(小时:分钟)

每一天的纪录保证按时间递增的顺序给出。当读到船号为-1时,全部输入结束,相应的结果不要输出。

输出格式:对每个测试用例输出1行,即当天的游客租船次数和平均租船时间(以分钟为单位的精确到个位的整数时间)。 输入样例: 1 S 08:10 2 S 08:35 1 E 10:00 2 E 13:16 0 S 17:00 0 S 17:00 3 E 08:10 1 S 08:20 2 S 09:00 1 E 09:20 0 E 17:00 -1 输出样例: 2 196 0 0

1 60

#include #include using namespace std; int main() {

int n,t[100],h,m,co=0,to=0; char cmd[10],tt[10];

for(memset(t,-1,sizeof(t));cin>>n&&n>=0;){ cin>>cmd>>tt; if(n>0){

sscanf(tt,\"%d:%d\

if(cmd[0]=='S')t[n-1]=h*60+m;

else if(t[n-1]>=0)++co,to+=h*60+m-t[n-1],t[n-1]=-1; }else{

cout<=co):0)<return 0; }

2007年浙江大学计算机学院考研复试上机试题及参考答案(4/6)

● 2007考研上机考试题目4--EXCEL排序(18分) Time limit: 1 Seconds

Total Submit: 415 Accepted Submit: 85

题目要求:Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。 具体的输入输出格式规定如下:

输入格式:测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N <=100000)

和 C,其中 N 是纪录的条数,C 是指定排序的列号。以下有 N行,每行包含一条学

生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。

输出格式:对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当C=2时,按姓名的非递减字典序排序;当 C=3

时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。 输入样例: 3 1

000007 James 85 000010 Amy 90 000001 Zoe 60 4 2

000007 James 85 000010 Amy 90 000001 Zoe 60 000002 James 98 4 3

000007 James 85 000010 Amy 90 000001 Zoe 60 000002 James 90 0 0

输出样例: Case 1:

000001 Zoe 60 000007 James 85 000010 Amy 90 Case 2:

000010 Amy 90 000002 James 98 000007 James 85 000001 Zoe 60 Case 3:

000001 Zoe 60 000007 James 85

000002 James 90 000010 Amy 90

#include #include #include #include using namespace std;

int n,c,aa[100010][2],ref[100010],ca=0; char ss[100010][10]; bool cmp(int a,int b) {

if(c==3&&aa[a][1]!=aa[b][1])return aa[a][1]if(c==2&&strcmp(ss[a],ss[b]))return strcmp(ss[a],ss[b])<0; return aa[a][0]int main() {

while(cin>>n>>c&&n){

printf(\"Case %d:\\n\ for(int i=0;icin>>aa[i][0]>>ss[i]>>aa[i][1],ref[i]=i; sort(ref,ref+n,cmp); for(int i=0;iprintf(\"%06d %s %d\\n\ref[i]][1]); } }

return 0; }

2007年浙江大学计算机学院考研复试上机试题及参考答案(5/6)

● 2007考研上机考试题目5--畅通工程(12分) Time limit: 1 Seconds

Total Submit: 326 Accepted Submit: 56

题目要求:省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。 具体的输入输出格式规定如下:

输入格式:测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。

输出格式:对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。 输入样例: 3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100 输出样例: 3 ?

#include using namespace std; int main() {

int

n,m,aa[110][110],v[110],min[110],ret,i,j,k,inf=(100<<16)+100; while(cin>>m>>n&&m){

memset(aa,100,sizeof(aa)); while(m--){

cin>>i>>j>>k;

aa[j-1][i-1]=aa[i-1][j-1]=k; }

for(ret=i=0;iif(!v[i]&&(k==-1||min[i]if(retreturn 0; }

2007年浙江大学计算机学院考研复试上机试题及参考答案(6/6) ● 2007考研上机考试题目6--最大报销额(12分) Time limit: 1 Seconds

Total Submit: 155 Accepted Submit: 3

题目要求:现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定额度的最大报销额。 具体的输入输出格式规定如下:

输入格式:测试输入包含若干测试用例。每个测试用例的第1行包含两个正数 Q 和 N,其中Q 是给定的报销额度,N(<=30)是发票张数。随后是 N 行输入,每行的格式为:

m Type_1:price_1 Type_2:price_2 ... Type_m:price_m

其中正整数 m 是这张发票上所开物品的件数,Type_i 和 price_i 是第 i 项物品的种类和价值。物品种类用一个大写英文字母表示。当N为0时,全部输入结束,相应的结果不要输出。

输出格式:对每个测试用例输出1行,即可以报销的最大数额,精确到小数点后2位。 输入样例: 200.00 3

2 A:23.50 B:100.00 1 C:650.00

3 A:59.99 A:120.00 X:10.00 1200.00 2

2 B:600.00 A:400.00 1 C:200.50 1200.50 3

2 B:600.00 A:400.00 1 C:200.50 1 A:100.00 100.00 0 输出样例: 123.50 1000.00 1200.50

#include #include using namespace std; double sum,a[40],b,bb; int n,nn,m; char ss[110];

double dfs(int cur,double v) {

if(cur>=n)return v;

double ret=0,ret2=dfs(cur+1,v);

if(v+a[cur]<=sum+1e-8)ret=dfs(cur+1,v+a[cur]); return ret>ret2?ret:ret2; }

int main() {

cout.precision(2);cout.setf(ios::fixed); while(cin>>sum>>nn&&nn){

for(n=0;nn--;n+=a[n]<=1000+1e-8&&bb<=600+1e-8){ for(cin>>m,a[n]=bb=0;m--;){ cin>>ss;

sscanf(ss+2,\"%lf\ bb=bb>b?bb:b;

a[n]+=(ss[0]>='A'&&ss[0]<='C'?b:1001); } }

cout<return 0; }

因篇幅问题不能全部显示,请点此查看更多更全内容