https://tans.fun/archives/2023-3-11-mei-tuan-bi-shi
这位大佬写出来了,坦克模拟没过,这个卷还是算难得了我觉得。
第一题:简单,数多少个连续的,x个就直接x / 2;
import java.util.Scanner;public class Meituan {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String s = sc.nextLine();int res = 0;for(int i = 0; i < s.length(); i++) {int j = i;while(j < s.length() && s.charAt(i) == s.charAt(j)) j++;res += (j - i) / 2;i = j - 1;}System.out.println(res);}
}
第二题:我的代码过了82%,我dp的,但是当时写得时候还是有点脑子懵懵的,所以代码有点冗余。
import java.util.Scanner;public class Meituan02 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();int k = sc.nextInt();sc.nextLine();int[][] color = new int[n][m];for(int i = 0; i < n; i++) {String s = sc.nextLine();for(int j = 0; j < m; j++) {if(s.charAt(j) == 'B') {color[i][j] = 1;} else if(s.charAt(j) == 'R') {color[i][j] = 0;}}}int[][] money = new int[n][m];for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {money[i][j] = sc.nextInt();}}int[][] dp = new int[n + 1][m + 1];int max = 0;for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {if(i == 0 && j == 0) {continue;}if(j == 0) {if(dp[i - 1][j] < 0) {dp[i][j] = -1;continue;}dp[i][j] = dp[i - 1][j] + money[i][j];if(color[i][j] != color[i - 1][j]) {dp[i][j] -= k;}max = Math.max(dp[i][j], max);continue;}if(i == 0) {if(dp[i][j - 1] < 0) {dp[i][j] = -1;continue;}dp[i][j] = dp[i][j - 1] + money[i][j];if(color[i][j - 1] != color[i][j]) {dp[i][j] -= k;}max = Math.max(dp[i][j], max);continue;}if(dp[i - 1][j] < 0 && dp[i][j - 1] < 0) {dp[i][j] = -1;continue;}if(dp[i - 1][j] > 0) {int t = dp[i - 1][j] + money[i][j];if(color[i - 1][j] != color[i][j]) t -= k;if(t > dp[i][j]) {dp[i][j] = t;}max = Math.max(max, dp[i][j]);}if(dp[i][j - 1] > 0) {int t = dp[i][j - 1] + money[i][j];if(color[i][j - 1] != color[i][j]) t -= k;if(t > dp[i][j]) dp[i][j] = t;max = Math.max(max, dp[i][j]);}}}System.out.println(max);}
}
有点着急了,思路有点乱,浪费了一点时间。
我的逻辑:
第一行第一列:continue;
第一行:只能从左来;
第一列:只能从上来;
否则:可以从左可以从上。
其实没必要做这么多判断,可以直接:
能从左来?从左来。
能从上来?从上来。
从左or从上取个最大。
第三题是差分数组的题,但是我没见过差分数组,所以只能模拟然后数了,可能是数据太大了,只过了18%。我的代码如下:
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;public class Meituan03 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[][] b_e = new int[n][2];for(int i = 0; i < 2; i++) {for(int j = 0; j < n; j++) {b_e[i][j] = sc.nextInt();}}int[] begin = new int[n];int[] end = new int[n];for(int i = 0; i < n; i++) {begin[i] = sc.nextInt();}for(int i = 0; i < n; i++) {end[i] = sc.nextInt();}PriorityQueue pq = new PriorityQueue<>((a, b)->a[0]-b[0]);for(int i = 0; i < n; i++) {pq.add(new int[]{begin[i], end[i]});}int i = 0;for(int[] p: pq) {begin[i] = p[0];end[i++] = p[1];}int res = 0;int lev = 0;for(i = 0; i < n; i++) {int cnt = 1;int b = begin[i];int e = end[i];for(int j = i + 1; j < n; j++) {if(begin[j] <= end[i]) {cnt++;b = begin[j];} elsebreak;}if(res < cnt) {res = cnt;lev = e - b + 1;} else if(res == cnt) {lev += e - b + 1;}res = Math.max(res, cnt);}System.out.println(res + " " + lev);}
}
有一说一有点尴尬,我java的自定义排序都给忘了。。。
package com.company.pdd;import java.util.Arrays;
import java.util.Comparator;public class PddTest {public static void main(String[] args) {int[][] be = new int[5][2];for(int i = 0; i < 5; i++) {be[i][0] = 5 - i;be[i][1] = i;}for(int[] b: be) {System.out.println(b[0] + " " + b[1]);}Arrays.sort(be, new Comparator() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0] - o2[0];}});for(int[] b: be) {System.out.println(b[0] + " " + b[1]);}}
}
Arrays.sort(数组, + 比较器对象(实现compare方法)。
傻乎乎的放到优先级队列里面。。。也没法出来查
第四题:。。。我前三题做的40来分钟吧,中间有卡住的,第四题一看感觉还行哈,但是实现起来给我晕的,,是在干不了。
第二卷第一题:这题很可惜,我以为提交了第一卷没发回来改了,所以一直在看第四题,没给这题留时间。。。结果一看,这么简单。。。
考完后我很快写出了下面的代码,不确定对不对。如果把1h留给这题,我怎么着也有60分呀。。。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Meituan201 {static int res = 0;static List[] father;public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();father = new ArrayList[n];int[] tree = new int[n];String s = sc.nextLine();for(int i = 1; i < n; i++) {char c = s.charAt(i);tree[i] = c == 'B'? 1 : -1;}for(int i = 1; i < n; i++) {int t = sc.nextInt();if(father[t] == null) {father[t] = new ArrayList();}father[t].add(t);}}public static int[] dfs(int root, int[] tree) {int red = 0;int blue = 0;for(int son: father[root]) {int[] r_b = dfs(son, tree);red += r_b[0];blue += r_b[1];}if(red == blue) res++;int cur = tree[root];if(cur == 1) red++;else blue++;return new int[]{red, blue};}}
上一篇:Flink从入门到精通系列(五)
下一篇:Hbase架构图及数据存储格式