Advertisement

2009年浙江大学计算机及软件工程研究生机试真题

阅读量:

题目1032:ZOJ

题目描述:

读入一个字符串,字符串中包含ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出,当某个字符用完时,剩下的仍然按照ZOJ的顺序输出。

输入:

题目包含多组用例,每组用例占一行,包含ZOJ三个字符,当输入“E”时表示输入结束。
1<=length<=100。

输出:

对于每组输入,请输出一行,表示按照要求处理后的字符串。
具体可见样例。

样例输入:

复制代码
    ZZOOOJJJ
    ZZZZOOOOOJJJ
    ZOOOJJ
    E

样例输出:

复制代码
    ZOJZOJOJ
    ZOJZOJZOJZOO
    ZOJOJO
复制代码
 #include<stdio.h>  
    
 #include<string.h>  
    
   
    
 int main(){  
    
     int i,ZCount,OCount,JCount;  
    
     char string[1000];  
    
     //freopen("C:\ Users\ SJF\ Desktop\ acm.txt","r",stdin);   
    
     while(scanf("%s",string) != EOF && strcmp(string,"E") != 0){  
    
     ZCount = 0,OCount = 0,JCount = 0;  
    
     //统计ZOJ字符的个数  
    
     for(i = 0;i < strlen(string);i++){  
    
         if(string[i] == 'Z'){  
    
             ZCount ++;  
    
         }  
    
         else if(string[i] == 'O'){  
    
             OCount ++;  
    
         }  
    
         else if(string[i] == 'J'){  
    
             JCount ++;  
    
         }  
    
     }  
    
     //按ZOJ的顺序输出  
    
     for(i = 0;i < ZCount || i < OCount || i < JCount;i++){  
    
         if(i < ZCount){  
    
             printf("Z");  
    
         }  
    
         if(i < OCount){  
    
             printf("O");  
    
         }  
    
         if(i < JCount){  
    
             printf("J");  
    
         }  
    
     }  
    
     printf("\n");  
    
     }  
    
 }  
    
    
    
    
    AI写代码

题目1034:寻找大富翁

题目描述:

浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.

输入:

输入包含多组测试用例.
每个用例首先包含2个整数n(0<n<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.
n和m同时为0时表示输入结束.

输出:

请输出乌镇前m个大富翁的财产数,财产多的排前面,如果大富翁不足m个,则全部输出,每组输出占一行.

样例输入:

复制代码
    3 1
    2 5 -1
    5 3
    1 2 3 4 5
    0 0

样例输出:

复制代码
    5
    5 4 3
复制代码
 #include<iostream>

    
 #include<cstdio>
    
 #include<stdlib.h>
    
 using namespace std;
    
 int cmp(const void* a,const void*b)
    
 {
    
 	return *(int*)a<*(int*)b;
    
 }
    
 int main()
    
 {
    
 	int a[100010];
    
 	int n,m;
    
 	while(cin>>n>>m&&(n||m))
    
 	{
    
 		for(int i=0;i<n;i++)
    
 		{
    
 			cin>>a[i];
    
 		}
    
 		qsort(a,n,sizeof(a[0]),cmp);//是c语言的库函数,stl是C++的库函数。。。 
    
 		if(n<m)
    
 		{
    
 			for(int i=0;i<n;i++)
    
 			{
    
 				if(i!=n-1)
    
 					cout<<a[i]<<" ";
    
 				else
    
 					cout<<a[i]<<endl;
    
 			}
    
 				
    
 		
    
 		}
    
 		else
    
 		{
    
 			for(int i=0;i<m;i++)
    
 			{
    
 				if(i!=m-1)
    
 					cout<<a[i]<<" ";
    
 				else
    
 					cout<<a[i]<<endl;
    
 			}
    
 		}
    
 	}
    
 	return 0;
    
 }
    
    
    
    
    AI写代码

题目1035:找出直系亲属

题目描述:

如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild,如果A,B是C的(外)曾祖父,曾祖母,则A,B是C的great-grandparent,C是A,B的great-grandchild,之后再多一辈,则在关系上加一个great-。

输入:

输入包含多组测试用例,每组用例首先包含2个整数n(0<=n<=26)和m(0<m<50), 分别表示有n个亲属关系和m个问题, 然后接下来是n行的形式如ABC的字符串,表示A的父母亲分别是B和C,如果A的父母亲信息不全,则用-代替,例如A-C,再然后是m行形式如FA的字符串,表示询问F和A的关系。
当n和m为0时结束输入。

输出:

如果询问的2个人是直系亲属,请按题目描述输出2者的关系,如果没有直系关系,请输出-。
具体含义和输出格式参见样例.

样例输入:

复制代码
    3 2
    ABC
    CDE
    EFG
    FA
    BE
    0 0

样例输出:

复制代码
    great-grandparent
    -
复制代码
 //第一反应就是并查集思想,计算两个人相差的代数然后输出结果

    
 #include<iostream>
    
 using namespace std;
    
 int child[100];//存储孩子 
    
 int find(int a,int b)//前面的看做长辈,后面的看做晚辈 
    
 {
    
 	int r=1;//一代 
    
 	while(child[a]!=-1) //a有孩子
    
 	{
    
 		if(child[a]==b)//如果b是a的孩子
    
 			return r;//直接返回一代
    
 		a=child[a];//将a的孩子赋值过来,进行迭代,看看到底二者相差多少代。 
    
 		r++; 
    
 	 } 
    
 	 return -1; 
    
  } 
    
 int main()
    
 {
    
 	int n,m,a,b,c,t;
    
 	char s[90];	
    
 	while(cin>>n>>m&&(n||m))
    
 	{
    
 		for(int i=0;i<n;i++)
    
 			child[i]=-1;//初始化每个人都没有孩子 
    
 		while(n--)
    
 		{
    
 			cin>>s;
    
 			a=s[0]-'A';
    
 			b=s[1]-'A';
    
 			c=s[2]-'A';
    
 			child[b]=child[c]=a;//b和c的孩子是a 
    
 		}
    
 		while(m--) 
    
 		{
    
 			cin>>s;
    
 			a=find(s[0]-'A',s[1]-'A'); //寻找两者相差的代数,因为不知道那个是长辈,所以两个都调用find函数 
    
 			b=find(s[1]-'A',s[0]-'A');
    
 			t=a>b?a:b;//取二者最大,但不知道谁大谁小,所以后面还要判断 
    
 			if(t<0)
    
 				cout<<"-"<<endl;
    
 			else
    
 			{
    
 				while(t>2)
    
 				{
    
 					cout<<"great-";
    
 					t--;
    
 				}
    
 				
    
 				if(t==2)
    
 				{
    
 					cout<<"grand";
    
 					t--;
    
 				}					
    
 				if(t==1)
    
 				{
    
 					if(a>b)
    
 						cout<<"parent"<<endl;
    
 					else
    
 						cout<<"child"<<endl; 
    
 				}
    
 			}	 
    
 		}
    
 		 
    
 	}
    
 	return 0;
    
 }
    
    
    
    
    AI写代码

全部评论 (0)

还没有任何评论哟~