浙江大学2005年复试上机题 解题报告

九度OJ 题目1010:A + B
时间限制:1 秒  内存限制:32 兆  特殊判题:否  提交:1431  解决:751
题目描述:
    读入两个小于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
//浙大2010:题目1010:A + B
//读入两个小于100的正整数A和B,计算A+B. 
//其中A和B的每一位数字由对应的英文单词给出
//input: 
//three four + five six =
//zero seven + eight nine =
//output: 
//90
//96

#include <fstream>
#include <string>
#include <iostream>
using namespace std;
string base[]={"zero","one","two","three","four","five",
	"six","seven","eight","nine"};

int getOperator( string s ){
	int i, j, result=0;
	string a, b;
	j = s.find(" ");
	if( j==-1 )
		for( i=0; i<10; i++ )
			if( s == base[i] ) return result+=i;
	a = s.substr(0,j);
	b = s.substr(j+1,s.length()-j-1);
	//cout << a << "." << b << "." << endl;//
	for( i=0; i<10; i++ )
		if( a == base[i] )
			result = 10*i;
	for( i=0; i<10; i++ )
		if( b == base[i] )
			return result+=i;
}

int main()
{
	int i, j, k, m, n;
	int idx;	//idx=index
	string s, s1, s2, a1, a2;
	ifstream cin("ZJU_1010.txt");//
	while( getline(cin,s) ){
		idx = s.find("+");
		s1 = s.substr(0,idx-1);
		s2 = s.substr(idx+2,s.length()-idx-4);
		//cout << s1 << "." << s2 << "." << endl;//
		
		k = getOperator(s1)+getOperator(s2);
		if( k ) cout << k << endl;

	}
	system("pause");
	return 0;
}


九度OJ 题目1011:最大连续子序列
时间限制:1 秒  内存限制:32 兆  特殊判题:否  提交:1170  解决:570
题目描述:
        给定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( 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

和清华06年的“题目1077:最大序列和”一致且更复杂些 算是清华也抄浙大一题?一来一回算是扯平了 莫非是好基友?!

//浙大2010:题目1011:最大连续子序列
//输出最大连续子序列的和 以及起点和终点元素
//如果最大连续子序列不唯一,则输出序号i和j最小的那个
//若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。

#include <fstream>
#include <memory.h>
#include <iostream>
using namespace std;

int main()
{
	int i, j, k, m, n;
	int sum, start, end, temp, tStart, a, first;
	ifstream cin("ZJU_1011.txt");//
	while( cin >> n && n ){
		cin >> a;
		sum = temp = start = first = a;
		for( i=1; i<n; i++ ){
			cin >> a;
			if( temp > 0 )
				temp += a;
			else	//当temp<=0时 另起新temp序列
				temp = tStart = a;
			if( temp > sum ){
				sum = temp;
				start = tStart;
				end = a;
			}
		}
		if( sum < 0 )
			cout << "0 " << first << " " << a << endl;
		else cout << sum << " " << start << " " << end << endl;
		
	}
	system("pause");
	return 0;
}


九度OJ 题目1012:畅通工程
时间限制:1 秒  内存限制:32 兆  特殊判题:否  提交:1273  解决:536
题目描述:
        某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
输入:
        测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。
        注意:两个城市之间可以有多条道路相通,也就是说
        3 3
        1 2
        1 2
        2 1
        这种输入也是合法的
        当N为0时,输入结束,该用例不被处理。
输出:
        对每个测试用例,在1行里输出最少还需要建设的道路数目。
样例输入:
    4 2
    1 3
    4 3
    3 3
    1 2
    1 3
    2 3
    5 2
    1 2
    3 5
    999 0
    0
样例输出:
    1
    0
    2
    998
暂留

九度OJ 题目1013:开门人和关门人
时间限制:1 秒  内存限制:32 兆  特殊判题:否  提交:1042  解决:567
题目描述:
        每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签到、签离记录,请根据记录找出当天开门和关门的人。
输入:
        测试输入的第一行给出记录的总天数N ( N> 0 ),下面列出了N天的记录。
        每天的记录在第一行给出记录的条目数M (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

对时间的处理 我是转换成了数字 也可以直接比较处理字符串 应该会更快点吧

//浙大2010:题目1013:开门人和关门人
//根据机房签到、签离记录找出当天开门和关门的人
//第一行 N M (N天 M行)
//记录格式:证件号码 签到时间 签离时间
//其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。

#include <fstream>
#include <string>
#include <iostream>
using namespace std;

int getTime( string s ){
	return (s[7]-48)+(s[6]-48)*10+(s[4]-48)*100
		+(s[3]-48)*1000+s[1]*10000+(s[0]-48)*100000;
}

int main()
{
	int i, j, k, m, n;
	string id, arrive, leave, minID, maxID;
	int arriveT, leaveT, Min, Max;
	ifstream cin("ZJU_1013.txt");//
	while( cin >> n ){
		for( j=0; j<n; j++ ){
			cin >> m;
			Min=600000; Max=-1;
			for( i=0; i<m; i++ ){
				cin >> id >> arrive >> leave;
				arriveT = getTime(arrive);
				leaveT = getTime(leave);
				if( Min > arriveT )
					{ Min = arriveT; minID = id; }
				if( Max < leaveT )
					{ Max = leaveT; maxID = id; }
			}
			cout << minID << " " << maxID << endl;
		}
	}
	system("pause");
	return 0;
}


九度OJ 题目1014:排名
时间限制:1 秒  内存限制:32 兆  特殊判题:否  提交:2130  解决:576
题目描述:
        今天的上机考试虽然有实时的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

C版的跑了80ms C++版跑了990ms(倒是也AC了 噗

//浙大2010:题目1014:排名
//找出最后通过分数线的考生,并将他们的成绩按降序打印。
//第1行给出考生人数N (0<N<1000)、考题数M (0<M<=10)、分数线G
//第2行排序给出第1题至第M题的正整数分值;
//以下N行,每行给出一名考生的准考证号(长度不超过20的字符串)、
//该生解决的题目总数m、以及这m道题的题号(题目号由1到M)。 
//若有多名考生分数相同,则按他们考号的升序输出。

#include <fstream>
#include <memory.h>
#include <algorithm>
#include <cstdio>
#include <iostream>
using namespace std;

struct STUDENT{
	char id[21];
	int score;
	bool pass;
}t[1000];

int getScore( int &M, int a[], bool AC[] ){
	int score=0;
	for( int i=0; i<M; i++ )
		if(AC[i]) score+=a[i];
	return score;
}

bool cmp( STUDENT x, STUDENT y ){
	if( x.score == y.score ){
		if( strcmp(x.id,y.id)<0 )
			return 1;
		else return 0;
	}
	return x.score > y.score;
}

int main()
{
	int i, j, k, m, n;
	int N, M, G, a[10], fin;
	bool AC[10];
	freopen("ZJU_1014.txt","r",stdin);//
	while( scanf("%d",&N)==1 && N ){
		scanf("%d%d",&M,&G);
		for( i=0; i<M; i++ )
			scanf("%d",&a[i]);
		for( i=0; i<N; i++ ){	//N个学生
			scanf("%s%d",t[i].id,&m);	//m=做成题目数
			memset(AC,0,sizeof(AC));
			for( j=0; j<m; j++ ){
				scanf("%d",&fin);
				AC[fin-1] = 1;
			}
			t[i].score = getScore(M,a,AC);
			if( t[i].score<G )
				t[i].pass = 0;
			else t[i].pass = 1;
		}
		int pt=0;//pt=pointer
		for( i=0; i<N; i++ )
			if(t[i].pass) t[pt++]=t[i];
		sort(t,t+pt,cmp);
		printf("%d\n",pt);
		for( i=0; i<pt; i++ )
			printf("%s %d\n",t[i].id,t[i].score);
	}
	while(1);//
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值