826 京东笔试2.75/3 (附代码)
第一题:
将读过的数放到hashset中去重,然后暴力遍历即可
public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] a = new int[n]; for (int i = 0; i < n; ++i) { a[i] = in.nextInt(); } HashSet<Integer> set = new HashSet<>(); for (int i = 0; i < n; ++i) { if (i != 0) System.out.print(" "); int target = i + 1 - a[i] % (i + 1); while (set.contains(target)) { target += i + 1; } set.add(target); System.out.print(target); } }
第二题:
暴力:分四种情况讨论
我只过了75%,卡在读取角色不存在,ok,可能是我读数的时候搞错了,那我每次读一行,自己切分算了,结果还是有问题
()public static void main(String[] args) throws FileNotFoundException { // Scanner in = new Scanner(new File("t2.txt")); Scanner in = new Scanner(System.in); int n = in.nextInt(); int m = in.nextInt(); boolean[] identifyHuman = new boolean[n]; int[] action = new int[n]; boolean[] exists = new boolean[n]; for (int i = 0; i < n; ++i) { identifyHuman[i] = "human".equals(in.next()); action[i] = in.nextInt(); exists[i] = true; } for (int i = 0; i < m; ++i) { int id1 = in.nextInt() - 1; int id2 = in.nextInt() - 1; boolean show1 = "Y".equals(in.next()); boolean show2 = "Y".equals(in.next()); if (!exists[id1] || !exists[id2]) continue; if (!identifyHuman[id1] && show2 && identifyHuman[id2]) { fight(id1, id2, action, exists); } else if (!identifyHuman[id2] && show1 && identifyHuman[id1]) { fight(id1, id2, action, exists); } else if (identifyHuman[id1] && show2 && !identifyHuman[id2] && action[id1] > action[id2]) { exists[id2] = false; } else if (identifyHuman[id2] && show1 && !identifyHuman[id1] && action[id1] < action[id2]) { exists[id1] = false; } } for (int i = 0; i < n; ++i) System.out.print((exists[i] ? 'Y' : 'N')); } static void fight(int id1, int id2, int[] action, boolean[] exists) { if (action[id1] < action[id2]) { exists[id1] = false; } else if (action[id1] == action[id2]) { exists[id1] = exists[id2] = false; } else exists[id2] = false; }
第三题:
背包问题+结果集回溯一下就ok
public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int t = in.nextInt(); int[][] arr = new int[n][4]; for (int i = 0; i < n; ++i) { for (int j = 0; j < 4; ++j) { arr[i][j] = in.nextInt(); } } //背包问题 int[][] dp = new int[n + 1][t + 1]; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= t; ++j) { int goodt = arr[i - 1][0];//完美解决的耗时 int goodv = arr[i - 1][1];//完美解决的价值 int badt = arr[i - 1][2];//暴力解决的耗时 int badv = arr[i - 1][3];//暴力解决的价值 dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); if (j >= goodt) { dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - goodt] + goodv); } if (j >= badt) { dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - badt] + badv); } } } //回溯结果集 int cur = t; int[] res = new int[n]; for (int i = n; i >= 1; --i) { int goodt = arr[i - 1][0]; int goodv = arr[i - 1][1]; int badt = arr[i - 1][2]; int badv = arr[i - 1][3]; //判断是不是选择了完美解决 if (cur >= goodt && dp[i - 1][cur - goodt] + goodv == dp[i][cur]) { cur -= goodt; res[i - 1] = 1; } //判断是不是选择了暴力解决 else if (cur >= badt && dp[i - 1][cur - badt] + badv == dp[i][cur]) { cur -= badt; res[i - 1] = 2; } //都不是,说明没有选择 else { res[i - 1] = 0; } } for (int i = 0; i < n; ++i) { if (res[i] == 0) System.out.print("F"); else if (res[i] == 1) System.out.print("A"); else System.out.print("B"); } }