题目一--A+B:
读入两个小于100的正整数A和B,计算A+B.需要注意的是:A和B的每一位数字由对应的英文单词给出.
Input
测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出.
Output
对每个测试用例输出1行,即A+B的值.
Sample Input
one + two =
three four + five six =
zero seven + eight nine =
zero + zero =
Sample Output
3
90
96
#include < string >
using namespace std;
string p[ 10 ] = ... {"zero","one","two","three","four","five","six","seven","eight","nine"} ;
int index( string st) ... {
for(int i=0;i<10;i++)
if(st==p[i])
return i;
}
int main() ... {
int a,b;
string s,r;
while(cin>>s)...{
a=b=0;
a=a*10+index(s);
while(cin>>r&&r!="+")
a=a*10+index(r);
while(cin>>r&&r!="=")
b=b*10+index(r);
if(a==0&&b==0)
break;
cout<<a+b<<endl;
}
}
题目二--开门人和关门人
Problem Description
每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。现有一堆杂乱的机房签
到、签离记录,请根据记录找出当天开门和关门的人。
Input
测试输入的第一行给出记录的总天数N ( > 0 )。下面列出了N天的记录。
每天的记录在第一行给出记录的条目数M ( > 0 ),下面是M行,每行的格式为
证件号码 签到时间 签离时间
其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。
Output
对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。
注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,
且没有多人同时签到或者签离的情况。
Sample Input
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
Sample Output
ME3021112225321 ME3021112225321
EE301218 MA301134
SC3021234 CS301133
#include < string >
#include < fstream >
#include < algorithm >
using namespace std;
int main() ... {
int i,j,N,M;
string s1,s2,s3;
string open,close,min,max;
while(cin>>N&&N!=0)...{
for(i=0;i<N;i++)...{
cin>>M;
min="23:59:59";
max="00:00:00";
for(j=0;j<M;j++)...{
cin>>s1>>s2>>s3;
if(min>s2)...{
min=s2;
open=s1;
}if(max<s3)...{
max=s3;
close=s1;
}
}
cout<<open<<" "<<close<<endl;
}
}
}
Problem Description
今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑
每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的
考生,并将他们的成绩按降序打印。
Input
测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N
< 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一
名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号
(题目号由1到M)。
当读入的考生人数为0时,输入结束,该场考试不予处理。
Output
对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高
到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考
号的升序输出。
Sample Input
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
Sample Output
3
CS003 60
CS001 37
CS004 37
0
1
CS000000000000000002 20
#include < fstream >
#include < string >
#include < algorithm >
using namespace std;
struct det ... {
string st;
int t;
} ;
bool cmp( struct det a, struct det b) ... {
return (a.t>b.t)||(a.t==b.t&&a.st<b.st);
}
int main() ... {
int i,j,N,M,G,m,s,t,n,a[10];
string st;
det b[1000];
while(cin>>N>>M>>G&&N)...{
for(i=0;i<M;i++)...{
cin>>t;
a[i]=t;
}
for(i=0,n=0;i<N;i++)...{
cin>>st>>m;
s=0;
for(j=0;j<m;j++)...{
cin>>t;
s+=a[t-1];
}
if(s>=G)...{
b[n].st=st;
b[n].t=s;
n++;
}
}
sort(b,b+n,cmp);
cout<<n<<endl;
for(i=0;i<n;i++)
cout<<b[i].st<<" "<<b[i].t<<endl;
}
}
Problem Description:给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个, 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和
为20。 在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该 子序列的第一个和最后一个元素。
Input
测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( < 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元
素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
Sample Input
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
Sample Output
20 11 13
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0
#include < fstream >
using namespace std;
int main()
... {
int a[10000],b[10000];
int k,n,m,i,j,l,start,end,max_start,max_end,max;
while(cin>>k)
...{
if(k==0)
break;
else
...{ l=0;
start=0,end=0;max_start=0;max_end=0;
for(i=0;i<k;i++)
...{ scanf("%d",&a[i]);
if(a[i]<0)
l++;
}
if(l==k)
cout<<0<<' '<<a[0]<<' '<<a[k-1]<<endl;
else
...{ b[0]=a[0];max=a[0];
for(i=1;i<k;i++)
...{
if(b[i-1]<=0)
...{ b[i]=a[i];
start=i;
end=i;
}
else
...{ b[i]=a[i]+b[i-1];
end++;
}
if(b[i]>max)
...{
max=b[i];
max_start=start;
max_end=end;
}
}
cout<<max<<' '<<a[max_start]<<' '<<a[max_end]<<endl;
}
}
}
}
Problem Description
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最少还需要建设的道路数目。
Sample Input
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0
Sample Output
1
0
2
998
#define MAXN 1010
#define inf 10000000
int a[MAXN][MAXN];
int prim( int n, int mat[][MAXN]) ... {
int min[MAXN],ret=0,v[MAXN],i,j,k;
for(i=0;i<n;i++)...{
min[i]=inf; v[i]=0;
}
for(min[j=0]=0;j<n;j++)
...{
for(k=-1,i=0;i<n;i++)
if(!v[i]&&(k==-1||min[i]<min[k]))
k=i;
for(v[k]=1,ret+=min[k],i=0;i<n;i++)
if(!v[i]&&mat[k][i]<min[i])
min[i]=mat[k][i];
}
return ret;
}
int main()
... {
int n,m,k,t,i,j;
while(scanf("%d",&n)&&n)
...{
for(i=0;i<n;i++)
...{ for(j=0;j<n;j++)
a[i][j]=1;
}
scanf("%d",&m);
for(i=0;i<m;i++)
...{
scanf("%d %d",&k,&t);
a[k-1][t-1]=a[t-1][k-1]=0;
}
t=prim(n,a);
printf("%d ",t);
}
return 0;
}