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写代码
