浙江大学2005年计算机考研上机复试

题目一--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  < iostream >
#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  < iostream >
#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  < iostream >
#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 < iostream >
#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
#include < stdio.h >
#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值