2011北邮计算机院复试上机题目

A 题目描述
给出一句英文句子(只由大小写字母和空格组成,不含标点符号,也不会出现连续的空格),请将其中的所有单词顺序翻转
输入格式
多组数据,以EOF结束。
每行一句英文句子(确保只由大小写字母和空格组成,不含标点符号,也不会出现连续的空格,字符串总长度1000以内)
输出格式
每组数据输出一行,为反转后的字符串
输入样例
It is a apple


# include<cstdio>
# include<iostream>
# include<vector>
# include<cstring>
using namespace std;
int main(){
	string str;
	while(getline(cin,str)){
		vector<string> vi;
		while(str.find(" ")!=string::npos){
			int pos=str.find(" ");
			vi.push_back(str.substr(0,pos));
			str=str.substr(pos+1);
		} 
		vi.push_back(str);
		cout<<vi[vi.size()-1];
		for(int i=vi.size()-2;i>=0;i--){
			cout<<" "<<vi[i];
		}
		cout<<endl;
	}
	return 0;
}
  • 使用stack更方便,无需vector逆序输出。
  • 需要注意的知识点思维导图
    B题目描述
    最近912星球的研究生入学了,912星球的教务处因此忙的焦头烂额,要求yzr做一个信息管理系统登陆查询研究生的考试成绩。
    但是yzr太弱了,你能帮帮忙么?
    912星球的每一位研究生都有一个名字id和一份星球考研成绩,可喜的是都是自然数。
    信息管理系统需要完成两个命令:
    1.“Insert空格id_number空格score_number”命令,表示登陆一个名字id为id_number,分数为score_number的同学的信息。
    其中id和score都是自然数,分别代表一位研究生的id和成绩(中间有一个空格)。
    2.“Find id_number”命令,表示查询一个名字id为id_number的研究生的成绩,需要输出对应的成绩

输入格式
首先输入一个整数T,表示一共有T组数据(0< T≤ 10)
每组数据的第一行包括一个数字n,表示这组数据一共n行,并且保证最多只有n位研究生,0< n≤ 100。
接下来每一行都有一条命令,形式如上所述。
不会有两名拥有同样名字id的同学,并且保证名字id是自然数且小于等于1000,得分为自然数且小于等于10000

输出格式
对于每一组数据中的每一条命令:
Insert命令无需任何对应输出
Find命令需要输出一行,形如“name:name_id空格score:score_number”,表示找到一个名字id为id_number,
分数为score_number的同学的信息。如果没有找到输出“No result!”。
输入:

2
2
Insert 0 10
Find 0
5
Insert 1 1
Find 2
Insert 2 2
Find 2
Find 1

AC代码:


# include<cstdio>
# include<iostream>
# include<cstring>
# include<map>
using namespace std;
int main(){
	int t;
	cin>>t;
	while(t--){
		map<int,int> myMap;
		int n;
		cin>>n;
		while(n--){
			string str;
			cin>>str;
			if(str=="Insert"){
				int id,score;
				cin>>id>>score;
				myMap[id]=score;
			}else{
				int id;
				cin>>id;
				map<int,int>::iterator it;
				it=myMap.find(id);
				if(it!=myMap.end()){
					cout<<"name:"<<it->first<<" score:"<<it->second<<endl;
				}else{
					cout<<"No result!"<<endl;
				}
				
			}
		}
		
	}
	return 0;	
}

知识点:
思维导图
C

/*
输入格式
有一棵多叉树T,你在树根处,宝藏在某一叶子节点L。现在你沿着树枝向叶子方向走去,从不回头,如果遇到树叉节点,
你等概率地挑选一个分支继续走。请问,在给定T,L的情况下,你有多大概率拿到宝藏?
第一行,整数N,M,L(1< N< 1000,0< M< 1000,0< L< N),分别代表树T上的节点数、树枝的个数,宝藏所在节点。
树根为0号结点。然后有M行,每行两个整数A,B(0≤ A,B< N)代表从节点A到节点B有一条树枝。
可以假设节点A总是更靠近树根。
输出格式
所求的概率,输出四舍五入到6位小数,然后换行。
6 5 5

0 1
1 3
0 2
2 4
2 5
*/

# include<cstdio>
# include<cstring>
# include<iostream>
# include<vector>
# define maxv 1000
using namespace std;
 vector <int> child[maxv]; //采用邻接表的形式来定义树
int parent[maxv];//parent数组用来记录结点的父亲。
int main(){
	int n,m,l;//n代表t上节点数目,树枝的个数,宝藏所在节点
	//n代表点的个数,m边的数目 
	cin>>n>>m>>l;
	parent[0]=-1;//根结点的父亲为-1;
	while(m--){
		int from,to;
		cin>>from>>to;
		child[from].push_back(to);//边from->to也就是父亲from->儿子to
		parent[to]=from;//to的父亲是from
	}
	int v=parent[l];
	double res=1.0;
	while(v!=-1){//从顶点v的父亲结点开始,到根结点结束,自下而上
		int num=child[v].size();//顶点v孩子的数量
		res*=1.0/num;//到顶点v的概率
		v=parent[v];
	}
	printf("%.6f\n",res);
	cout<<endl;
}

思路:树的题目很多都可以用邻接表来表示,这题如果用邻接表表示更轻松。我觉得我这道题目做的很简单,欢迎大家使用我的方法。
D 我是直接放弃

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值