北邮2019计算机院机试真题回忆版

本文探讨了二进制运算及图论中的经典问题解决方法,包括二进制加法、二叉树路径长度计算以及图中寻找最短路径的算法实现。通过具体的代码实例,展示了如何使用C++高效地解决这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem A 二进制

题目描述

32位二进制数X,对其进行X+1,X+3 操作,并输出。注意不能忽略前导0

输入

第一行,一个整数T,代表测试数据组数。
接着T行,输入32为二进制数

输出

对每组测试数据,输出两行,第一行为X+1,第二行为X+3.

测试样例

输入

2
00000000000000000000000000000000
00000000000000000000000000000001

输出

00000000000000000000000000000001
00000000000000000000000000000011
00000000000000000000000000000010
00000000000000000000000000000100

代码

#include<bits/stdc++.h>
using namespace std;

//二进制数 
int main() {
	int T;
	string s;

	cin>>T;
	while(T--) {
		cin>>s;
		//X+1
		for(int i=s.size()-1; i>=0; i--) {
			if(s[i]=='1') {  //低位到高位遇1进位
				s[i]='0';
			} else {          //遇到第一个0进1,结束循环
				s[i]='1';
				break;
			}
		}
		cout<<s<<endl;
		//X+3
		for(int i=0; i<2; i++) { //X+1 基础上再加 2
			for(int i=s.size()-1; i>=0; i--) {
				if(s[i]=='1') {  //低位到高位遇1进位
					s[i]='0';
				} else {          //遇到第一个0进1,结束循环
					s[i]='1';
					break;
				}
			}
		}
		cout<<s<<endl;
	}
	return 0; 
}

Problem B. 二叉树

题目描述

对二叉树,计算任意两个结点的最短路径长度。

输入

第一行输入测试数据组数T
第二行输入n,m 。n代表结点的个数,m代表要查询的数据组数
接下来n行,每行输入两个数,代表1~n结点的孩子结点,如果没有孩子结点则输入-1.根节点为1.
接下来m行,每行输入两个数,代表要查询的两个结点

输出

每组测试数据输出m行,代表查询的两个结点之间的最短路径长度

测试样例

输入

1
8 4
2 3
4 5
6 -1
-1 -1
-1 7
-1 -1
8 -1
-1 -1
1 6
4 6
4 5
8 1

输出

2
4
2
4

代码

#include<bits/stdc++.h>
using namespace std;

//二叉树,最近公共祖先的变形 
int main(){
	int T,n,m,lchild,rchild,x,y;
	
	cin>>T;
	while(T--){
		stack<int> s1,s2;
		cin>>n>>m;
		int a[n+1];;
		
		a[1]=1000;//根节点父节点 
		for(int i=1;i<=n;i++){
			cin>>lchild>>rchild;
			if(lchild!=-1) a[lchild]=i;
			if(rchild!=-1) a[rchild]=i;
		}
		while(m--){
			while(!s1.empty()) s1.pop(); //清空栈
			while(!s2.empty()) s2.pop();
			 
			cin>>x>>y;
			
			s1.push(x); //把 x及其所有祖先结点压栈
			while(a[x]!=1000){
				x=a[x];
				s1.push(x);
			} 
			s2.push(x); //把 y及其所有祖先结点压栈
			while(a[y]!=1000){
				y=a[y];
				s2.push(y);
			} 
			
			while(!s1.empty()&&!s2.empty()){  //出栈到公共祖先 
				if(s1.top()==s2.top()){
					s1.pop();
					s2.pop();
				}else{
					break;
				}
			}
			int ans;
			ans=s1.size()+s2.size();    
			cout<<ans<<endl;
		} 
		
	}
	return 0;
} 

Problem C.最短路径

题目描述

在白天和黑夜要从城市1到城市n,黑夜会关掉若干条线路,分别寻找城市1到城市n的在白天和黑夜的最短路径。保证每个城市与其他城市必有连接。(ps:两个城市之间可能存在多条路径,考试时后通知的)

输入

第一行数据组数T
第二行输入n,m,k. n代表城市数,m代表路径数,k代表夜间关闭的路径数
接下来m行,每行输入三个数x,y,z,代表城市x和城市y之间的路径距离
最后一行k个数,代表晚上关闭的线路序号(线路序号指的是1~m)

输出

每组数据输出两行,分别代表白天和黑夜,城市1到n的最短路径

测试样例

1
4 4 1
1 2 1
2 3 1
3 4 1
1 4 1
4

输出

1
3

代码

ps:没考虑重边

#include<bits/stdc++.h>
using namespace std;

//最近距离
int main(){
	int T,n,m,k,x,y,val,close;
	
	cin>>T;
	while(T--){
		cin>>n>>m>>k;
		int a[n][n],b[n][n],c[n][2];
		
		//邻接矩阵存储 
		for(int i=1; i<=n; i++) { //图的最初初始化为都不可达
			for(int j=1; j<=n; j++) {
				a[i][j]=100000;
				b[i][j]=100000;
			}
		}
		//无向图,邻接矩阵存储 
		for(int i=1; i<=m; i++) { //对输入的节点关系进行初始化
			cin>>x>>y>>val;
			a[x][y]=val;
			a[y][x]=val;
			b[x][y]=val;
			a[y][x]=val;
			c[i][0]=x; //记录是第几条路 
			c[i][1]=y;
		}
		//Floyd算法主体 
		for(int l=1; l<=n; l++) { //以 l节点作为中间节点,更新邻接矩阵
			for(int i=1; i<=n; i++) {
				for(int j=1; j<=n; j++) {
					if(a[i][l]==n||a[l][j]==n){  //如果不可达则继续循环,不继续执行循环体内语句 
						continue;
					}   
					if(a[i][l]+a[l][j]<a[i][j]) {
						a[i][j]=a[i][l]+a[l][j];
					}
				}
			}
		}
		while(k--){  //关闭道路 
			cin>>close;
			x=c[close][0]; 
			y=c[close][1]; 
			b[x][y]=100000; 
			b[y][x]=100000; 
		}
		for(int l=1; l<=n; l++) { //以 l节点作为中间节点,更新邻接矩阵
			for(int i=1; i<=n; i++) {
				for(int j=1; j<=n; j++) {
					if(b[i][l]==100000||b[l][j]==100000){  //如果不可达则继续循环,不继续执行循环体内语句 
						continue;
					}   
					if(b[i][l]+b[l][j]<b[i][j]) {
						b[i][j]=b[i][l]+b[l][j];
					}
				}
			}
		}
		cout<<a[1][n]<<endl;
		cout<<b[1][n]<<endl;
		
	}
	
	return 0;
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值