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");  
    }  
}  

题目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;
}

题目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;
}




你可能感兴趣的:(2009年浙江大学计算机及软件工程研究生机试真题)