九度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
九度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
九度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
九度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
时间限制: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;
}