第一部分
选择题:线性代数,排列组合,概率题,代码题判断题,Java语言基础题
第二部分
算法题三道,ACM模式,可用IDE
第一题
给N个杯子倒扣在桌面上,在第X个杯子中有一个球,移动杯子里面的球会跟着移动,经过K次移动,求最后那个球在第几个杯子中?
输入:
3 2 3 1 3 3 2 1 2
输出
3
(输入的意思是有3个杯子,球在第2个杯子中,经过三次移动,第一次移动为第一个与第三个杯子交换位置,第二次移动为第三个杯子与第二个杯子交换,第三次移动为第一个杯子与第二个杯子交换。最终输出3,意思为球最终在第三个杯子中)
我的代码:
public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int X = sc.nextInt(); int K = sc.nextInt(); int[] cups = new int[N + 1]; cups[X] = 1; for (int i = 0; i < K; i++) { int cup1 = sc.nextInt(); int cup2 = sc.nextInt(); swap(cups,cup1,cup2); } for (int i = 1; i <= cups.length; i++) { if (cups[i] == 1) { System.out.println(i); return; } } } private static void swap(int[] cups, int i, int j) { int tmp = cups[i]; cups[i] = cups[j]; cups[j] = tmp; }
第二题
有n个基站,我们还可以多设置k个基站,问我们怎么设置基站能够使噪音最小,返回最小噪音。
输入:
3 1 1 4 5
意思为已经有三个基站,我们还可以再设置一个基站。那么目前噪音为max{4-1,5-4} = 3
那么我们在1和4之间建立基站2,那么噪音为max{2-1,4-2,5-4} = 2,那么最终返回2
输出
2
我的想法是将这些基站位置放到int数组中,循环k次设置多出来的基站,每次我们寻找基站之间的距离最远的在其中间设置一个基站。这样k次之后得到噪音就是所求。
之前我一直纠结怎么存放数据,是不是要放到TreeMap中,之后想到用数组,然后排序一下就行了。
没时间提交了,也不知道对不对
static int n; static int k; public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); k = sc.nextInt(); int[] zhan = new int[n + k]; for (int i = 0; i < n; i++) { zhan[i] = sc.nextInt(); } int max = 0; for (int i = 0; i <= k; i++) { max = maxZao(zhan); } System.out.println(max); } private static int maxZao(int[] zhan) { Arrays.sort(zhan); int max = 0; int index=0; for (int i = 1; i < zhan.length; i++) { if (zhan[i] - zhan[i - 1] > max) { max = zhan[i] - zhan[i - 1]; index = i; } } k--; zhan[n++] = (zhan[index] - zhan[index - 1])/2; return max; }
第三题
给一个n*m的迷宫,'.'表示道路,'#'表示障碍,我们要从左上角走到右下角,走的过程中我们可以上下左右都能走(当然不能超出范围),我们可以将障碍变成道路,我们只能在道路上走,问我们最少需要将多少障碍变成道路才能从左上走到右下呢?
输入
3 3 .## #.. .#.
输出
1
我们将第二行第一列的障碍变成道路,就行了
输入
3 3 .## #.# .#.
输出
2
可以将第二行第一列和第三列变成道路
我不会做。。。因为它可以上下左右都能走,不是只能向下和向右,不会做,求大佬代码~
我的代码栈溢出了。。。。。:cry:
public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); char[][] mi = new char[n][m]; sc.nextLine(); for (int i = 0; i < n; i++) { String s = sc.nextLine(); for (int j = 0; j < s.length(); j++) { mi[i][j] = s.charAt(j); } } walk(mi, 0, 0, 0); } static int res = Integer.MAX_VALUE; static int[][] dd = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}}; public static void walk(char[][] mi, int i, int j, int barrier) { if (i < 0 || j >= mi[0].length|| i >= mi.length || j < 0) { return; } if (mi[i][j] == '#') { barrier++; } if (i == mi.length && j == mi[0].length) { res = Math.min(res, barrier); } for (int k = 0; k < dd.length; k++) { int newX = i + dd[k][0]; int newY = j + dd[k][1]; walk(mi, newX, newY, barrier); } }
全部评论
(5) 回帖