浙江大学计算机复试上机2005-2007(由林子整理)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 =输出样例:39096#include <>#include <>#include <>#include <>int main(void){const char data[12][6] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "+", "="};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; i<strlen(str); ++i){for(j=0;!isspace(str[i])&&i<strlen(str);++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; /* 字符串结束标记,result形式"123+456=" */sscanf(result,"%d+%d=",&a,&b); /* 用sscanf来获得a,b的值*/ if( a==0 && b==0 ) break; /* A,B同时为零则退出程序*/else printf("%d\n", a + b);/* 打印输出A + B 的数值*/}while(1);return 0;}2005年浙江大学计算机学院考研复试上机试题及参考答案(2/5) 第二题:谁是开门关门的人(10分)题目要求:每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。
现有一堆杂乱的机房签到、签离记录,请根据记录找出当天开门和关门的人。
输入格式:测试输入的第一行给出记录的总天数N ( > 0 )。
下面列出了N天的记录。
每天的记录在第一行给出记录的条目数M ( > 0 ),下面是M行,每行的格式为证件号码签到时间签离时间其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。
输出格式:对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。
注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,且没有多人同时签到或者签离的情况。
输入样例:31ME25321 00:00:00 23:59:59 2EE301218 08:05:35 20:56:35 MA301134 12:35:45 21:40:42 3CS301111 15:30:28 17:00:10 SC3021234 08:00:00 11:25:25 CS301133 21:45:00 21:58:40输出样例:ME25321 ME25321EE301218 MA301134SC3021234 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",& N);/* 读入记录的总天数*/while(N--){scanf("%d", & M);/* 读入该天的进出人员数*/pTimeList = (Record *)malloc(M*sizeof(Record));for(i=0,first=0,last=0; i<M; ++i){scanf("%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;}} /* for i */printf("%s %s\n", pTimeList[first].id, pTimeList[last].id);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 2510 10 12 13 15CS004 3 5 1 3CS003 5 2 4 1 3 5CS002 2 1 2CS001 3 2 3 51 2 4010 30CS001 1 22 3 2010 10 10CS000000000000000001 0 CS000000000000000002 2 1 2 0输出样例:3CS003 60CS001 37CS004 371CS000000000000000002 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 ) && N!=0 )/* 读入考生人数N */{scanf("%d%d", &M, &G);/* 读入题目数量和分数线*/ pMarkList = (int *)malloc(M*sizeof(int));/* M道题目的分数*/ pStuinfo = (StuInfo *)malloc(N*sizeof(StuInfo));/* N个考生*/ for(i=0; i<M; ++i)/* 读入M题每题分数*/scanf("%d", & (pMarkList[i]) );for(i=0, n=0; i<N; ++i)/* 读入N个考生信息,i用于计数N次,cnt用于计算上线考生记录*/{scanf("%s%d", & (pStuinfo[n].id), &m);/* 准考证号,解出的题目数量m */for(pStuinfo[n].score=0,j=0; j<m; ++j) /* 读入答出的m题的题号*/{scanf("%d", & a ); /* 读入答对题的题号*/pStuinfo[n].score += pMarkList[ a-1 ]; /* 因为题号是从1开始的;计算该考生的总分*/}if(pStuinfo[n].score >= G)/* 如果考生上线则记录下来*/n++; /* 否则不予记录,便于排序*/}for(i=0; i<n-1; ++i)/* 输入完毕,对上线考生先按分数排序,降序*/{for(k=i, j=i+1; j<n; ++j)if(pStuinfo[j].score > pStuinfo[k].score)k = j;tmp = pStuinfo[k];pStuinfo[k] = pStuinfo[i];pStuinfo[i] = tmp;}for(i=0; i<n; i+=k) /* 相同总分考生再按照准考证号排序*/ {/* 统计相同分数考生人数k */for(k=1,j=i+1; j<n; ++j){if(pStuinfo[i].score == pStuinfo[j].score)k++;elsebreak;}/* 下标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",n);/* 排序完毕,按照要求输出,上线人数*/ for(i=0; i<n; ++i)/* 和每个上线考生的准考证号和总分数*/ printf("%s %d\n",pStuinfo[i].id,pStuinfo[i].score);free(pMarkList);free(pStuinfo);}return 0;}2005年浙江大学计算机学院考研复试上机试题及参考答案(4/5)第四题:最大连续子序列(13分)题目要求:给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ...,Nj },其中 1 <= i <= j <= K。