微众银行笔试
1.给定x^3+y^4+z^5=k
import java.util.*; /** * @author wanna * @version v1.0 * @Package com.wanna.main31 * @date 2021/9/24 9:50 上午 */ public class Main { /* @微众银行 给定一个k,求是否有正整数x,y,z符合x^3+y^4+z^5=k(k<=10^12)。 如果存在输出YES,不存在输出NO 第一行输入是一个n,代表即将要输入的k的行数 后面n行输入的就k,一个k对应一个YES/NO */ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); long N = scanner.nextLong(); //数据的行数... List<Long> list = new ArrayList<>(); //k可以到10^12次方,得用long去存了 //扫描数据放到结果中 for (long i = 0; i < N; i++) { list.add(scanner.nextLong()); } list.forEach(Main::process2); } /** * 直接三重暴力解,能过36%的测试用例 * * @param num num */ public static void process(Long num) { boolean flag = false; for (long i = 1; i < num; i++) { for (long j = 1; j < num; j++) { for (long k = 1; k < num; k++) { if ((long) Math.pow(i, 3) + (long) Math.pow(j, 4) + (long) Math.pow(k, 5) == num) { flag = true; break; } } } } System.out.println(flag ? "YES" : "NO"); } /** * 优化,能过73%的测试用例...不知道该怎么继续优化了 * * @param num num */ public static void process2(Long num) { Set<Long> set = new HashSet<>(); boolean flag = false; for (long i = 1; i <= Math.pow(num, 0.34); i++) { // 1/3 for (long j = 1; j <= Math.pow(num, 0.25); j++) { // 1/4 set.add((long) Math.pow(i, 3) + (long) Math.pow(j, 4)); } } for (long k = 1; k <= Math.pow(num, 0.2); k++) { // 1/5 if (set.contains((long) (num - Math.pow(k, 5)))) { flag = true; break; } } System.out.println(flag ? "YES" : "NO"); } }2.机甲
import java.util.Scanner; /** * @author wanna * @version v1.0 * @Package com.wanna.main33 * @date 2021/9/24 9:51 上午 */ public class Main { /* @微众银行 一台机甲在一个二维空间里移动,它的移动受到一串事先写好的指令的控制,每条指令会让它往特定方向移动一格。 该空间为矩形,四周都是墙壁,无法通过,空间中每个格子位置的阻力不同,我们用一个数值来表示它的阻力, 还有一些格子存在障碍无法通过。机器人每走一格,需要消耗能量,能量数为走之前和走之后位置的阻力数值中较大的那个数。 当它的方向改变时,消耗能量 x,当它走向墙壁或者障碍物时,会停在原地并消耗能量 y(如果需要,仍会先改变方向)。 一开始它位于整个空间的左上角,第一步移动不需要花能量改变方向,请计算它最后总共消耗了多少能量。 输入描述 第一行四个整数 n, m, x, y,(0 < n, m <= 100,1 <= x, y <= 100000) 后面 n 行,每行 m 个数,形成一个方阵,表示各个格子位置的阻力数值,如果为 -1,表示该位置无法通过。各个位置的数值范围为 [-1, 100000]。 最后一行一个字符串,由 hjkl 四种字母组成,表示指令序列。h 表示向左移动一格, j 表示向下移动一格,k 表示向上移动一格,l 表示向右移动一格。字符串长度不超过 100000。 输出描述 一个整数,表示消耗的总能量。 AC 100% */ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); int x = scanner.nextInt(); int y = scanner.nextInt(); int[][] grid = new int[n][m]; //申请一个矩阵空间 //读取 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { grid[i][j] = scanner.nextInt(); } } char[] command = scanner.next().toCharArray(); //指令 process(grid, command, x, y); } //x是方向改变的消耗 //走向墙壁或者是障碍物,会停留在原地,但是消耗能量消耗y //如果grid[i][j]=-1,那么表示的是不可走 public static void process(int[][] grid, char[] command, int x, int y) { long count = 0; //记录能量的消耗值... int xPos = 0, yPos = 0; //消耗为走之前和之后的能量最大值 //遍历所有的命令集合... //hjkl,左下上右 for (int i = 0; i < command.length; i++) { //如果遇到了墙壁 if ((command[i] == 'h' && yPos == 0) || (command[i] == 'k' && xPos == 0) || (command[i] == 'j' && xPos == grid.length - 1) || (command[i] == 'l' && yPos == grid[0].length - 1)) { count += y; } //走到这里不是碰到墙壁... //如果是碰到了障碍物的话...需要累加上y else if ((command[i] == 'h' && grid[xPos][yPos - 1] == -1) || (command[i] == 'k' && grid[xPos - 1][yPos] == -1) || (command[i] == 'j' && grid[xPos + 1][yPos] == -1) || (command[i] == 'l' && grid[xPos][yPos + 1] == -1)) { count += y; //如果方向发生了改变 } else { int last = grid[xPos][yPos]; //记录走之前的阻力 int current; //左 if (command[i] == 'h') { yPos--; //上 } else if (command[i] == 'k') { xPos--; //下 } else if (command[i] == 'j') { xPos++; //右 } else { yPos++; } current = grid[xPos][yPos]; count += Math.max(last, current); //应该加上两者的最大值... } //如果方向发生了改变 if (i >= 1 && command[i] != command[i - 1]) { count += x; } } System.out.println(count); } }3.前缀序列
import java.util.Arrays; import java.util.Scanner; /** * @author wanna * @version v1.0 * @Package com.wanna.main32 * @date 2021/9/24 9:50 上午 */ public class Main { /* @微众银行 题目描述: 已知一个长度为n的序列A。我们求出了它的前缀序列,但是却不小心把它的原序列丢失了,请你从它的前缀序列中推出它的原序列,并输出出来。 这里的前缀序列B定义为,B[i]为所有下标小于等于i中的元素中,所有奇数位置的和减去所有偶数位置的和。A序列和B序列的下标均从1开始。 输入描述 输入第一行仅包含一个正整数n,表示序列的长度。(1<=n<=10000) 输入第二行包含n个整数,空格隔开,表示一个前缀序列,所有整数的绝对值都小于等于10^9。 输出描述 输出仅包含一行,包含n个整数,表示原序列,中间用空格隔开。 */ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int N = scanner.nextInt(); int[] list = new int[N + 1]; for (int i = 1; i <= N; i++) { list[i] = scanner.nextInt(); } process(list, N); } public static void process(int[] list, int N) { //AC 100% int[] old = new int[N + 1]; for (int i = 1; i <= N; i++) { int sign = i % 2 != 0 ? 1 : -1; old[i] = (list[i] - list[i - 1]) * sign; } Arrays.stream(old, 1, N + 1) .mapToObj(String::valueOf) .reduce(((left, right) -> left + " " + right)) .ifPresent(System.out::println); } }