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