小言_互联网的博客

BUPT2019计院上机

249人阅读  评论(0)

第一题

题目描述:
输入 32 位的二进制 01 串,输出这个数+1 和+3 后的 32 位二进制串
输入描述:
先输入 T,表示输入的组数
然后输入 T 行二进制串
输出描述:
输出+1 和+3 后的二进制串
输入样例:
2
00000000000000000000000000000000
00000000000000000000000000000001
输出样例:
00000000000000000000000000000001
00000000000000000000000000000011
00000000000000000000000000000010
00000000000000000000000000000100

import java.util.Scanner;

public class c1901 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		for(int i = 0;i<n;i++) {
			String s  = sc.next();
			StringBuilder sb = new StringBuilder(s);
			for(int j = 1;j<=3;j++) {
				for(int k = sb.length()-1;k>=0;k--) {
					if(sb.charAt(k)=='0') {
						sb.setCharAt(k, '1');
						break;
					}else {
						sb.setCharAt(k, '0');
					}
				}
				if(j==1||j==3) {
					System.out.println(sb);
				}
			}
		}
	}
}

第二题

题目描述:
大概意思就是根据输入父节点的两个子节点,根据输入构建一棵树,然后输入两个节点,
寻找两个节点之间的距离
距离定义:

输入描述:
先输入 T,表示输入的组数
再输入 n,m,n 表示父节点个数(n>=1),其中 1 号节点默认为根节点,
m 表示查询的组数
输出描述:
每组查询的两个点之间的距离
输入样例:
1
5 2
2 3
4 5
6 -1
-1 -1
7 -1
6 7
2 3
输出样例:
52

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class c1902 {

	static int[] parent;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int sum = sc.nextInt();
		for(int k = 0;k<sum;k++) {
			int n = sc.nextInt();
			int m = sc.nextInt();
			parent = new int[2*n+1];
			Arrays.fill(parent, -1);
			Queue<Integer> queue = new LinkedList<Integer>();
			queue.add(1);
			for(int i  = 0;i<n;i++) {
				int a = sc.nextInt();
				int b = sc.nextInt();
				int father = queue.peek();
				queue.remove();
				if(a!=-1) {
					parent[a] = father;
					queue.add(a);
				}
				if(b!=-1) {
					parent[b] = father;
					queue.add(b);
				}
			}
			for(int i = 0;i<m;i++) {
				int a = sc.nextInt();
				int b = sc.nextInt();
				//遍历a的每个爹,看哪一个爹也是b的爹
				int bothfather = 0;
				int tempa = a;
				int tempb = b;
				while(tempa!=-1) {
					if(isfather(tempa,tempb)) {
						bothfather = tempa;
						break;
					}
					tempa = parent[tempa];
				}
				
				int ans = 0;
				tempa = a;
				tempb = b;
				while(tempa!=bothfather) {
					ans++;
					tempa = parent[tempa];
				}
				while(tempb!=bothfather) {
					ans++;
					tempb = parent[tempb];
				}
				System.out.println(ans);
			}
		}
		
		sc.close();
	}
	
	static boolean isfather(int a,int b) {
		while(parent[b]!=-1) {
			if(parent[b]==a) {
				return true;
			}
			b=parent[b];
		}
		return false;
	}
}

第三题

输入描述:
有 n(n<=50)个城市,保证每个城市与其他城市之间必然有连接,
但是两个城市之间会存在多条道路(即有重边,这点考试开始没
说,之后发公告才知道,我想基本 3A 的原因在此),输入道路连接
的两个城市号及道路长度。同时在夜晚,某些道路会封路。请输出
在白天和夜晚从城市 1 到城市 n 之间的最短路径。
输入描述:
先输入 T,表示有 T 组数据
再输入 n,m,k,n 表示有 n 个城市,表示总共有 m 条边,k 表示
在夜晚有 k 条路封路
接下来 n 行,输入 n 条边的两个端点及长度
接下来 k 行,输入夜晚要封第几条路
输出描述:
输出白天和夜晚从 1 号城市到 n 号城市的最短距离
输入样例:
1
4 5 1
1 2 1
2 3 2
3 4 3
1 3 1
1 4 7
4
输出样例:
4 6

import java.util.Scanner;

public class c1903 {
	
	static int n;
	static int[] vis;
	static int[][] dis;
	static int[] min;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for(int i = 0;i<T;i++) {
			n = sc.nextInt();
			int m = sc.nextInt();
			int k = sc.nextInt();
			vis = new int[n+1];
			dis = new int[n+1][n+1];
			min = new int[n+1];
			Edge[] edge = new Edge[m+1];
			init();
			for(int j = 1;j<=m;j++) {
				int p1 = sc.nextInt();
				int p2 = sc.nextInt();
				int len = sc.nextInt();
				dis[p1][p2] = len;
				dis[p2][p1] = len;
				edge[j] = new Edge(p1,p2,len);
			}
			
			System.out.println(Dij());
			
			init();
			for(int j = 1;j<=m;j++) {
				int p1 = edge[j].p1;
				int p2 = edge[j].p2;
				int len = edge[j].len;
				dis[p1][p2] = len;
				dis[p2][p1] = len;
			}
			
			for(int j = 0;j<k;j++) {
				int dark = sc.nextInt();
				int p1 = edge[dark].p1;
				int p2 = edge[dark].p2;
				dis[p1][p2] = Integer.MAX_VALUE/2;
				dis[p2][p1] = Integer.MAX_VALUE/2;
			}

			System.out.println(Dij());
			
		}
		
		sc.close();
	}
	static class Edge{
		int p1;
		int p2;
		int len;
		public Edge(int p1, int p2,int len) {
			super();
			this.p1 = p1;
			this.p2 = p2;
			this.len = len;
		}
		
	}
	
	static void init() {
		for(int j = 1;j<=n;j++) {
			vis[j] = 0;
			min[j] = Integer.MAX_VALUE/2;
			for(int l = 1;l<=n;l++) {
				if(j==l) {
					dis[j][l] = 0;
				}else {
					dis[j][l] = Integer.MAX_VALUE/2;
				}
			}
		}
	}
	
	static int Dij() {
		vis[1] = 1;
		min[1] = 0;
		
		for(int i = 2;i<=n;i++) {
			int temp = Integer.MAX_VALUE/2;
			int minp = 0;
			for(int j = 2;j<=n;j++) {
				if(vis[j]==0&&dis[1][j]<temp) {
					temp = dis[1][j];
					minp = j;
				}
			}
			vis[minp] = 1;
			min[minp] = temp;
			
			for(int j = 2;j<=n;j++) {
				if(vis[j]==0&&(dis[1][minp]+dis[minp][j]<dis[1][j])) {
					dis[1][j] = dis[1][minp]+dis[minp][j];
				}
			}
		}
			
		return min[n];
	}
}

第四题

第四题:
题目描述(具体太长,只说大意,我也没 A 出来,额,发现我好像
理解错题目意思了,大家别看我写的这题了,有点错误):
给出一张从原图片中沿横纵向剪切后的图片,判断原图片中 nn
(n>=1)矩阵的大小
(原图片肯定存在该 n
n 的矩阵,且唯一)
输入描述:
先输入 T,表示输入的组数
再输入 n,m,表示矩阵的行列
再输入该剪切后的图片,·表示空白,#表示图片中矩阵的内容
输出描述:
输出原图片中最小 n*n 矩阵的大小,即 n 的值,如果不存在则输出- 1

我也没看懂题,有知道的烦请告知。


转载:https://blog.csdn.net/qq_39419821/article/details/104580797
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场