第一题:幸运员工抽奖
从团队中选出整个工号中含有数字7或者工号是7的倍数的员工。
输入:一组空格分隔的员工工号列表。
输出:幸运员工总人数,未找到时输出0。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class q1 { public static void main(String[] args) throws IOException { // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); if (str == null || str.length() == 0) { System.out.println(0); return; } String[] strs = str.split(" "); int len = strs.length; int[] arr = new int[len]; int sum = 0; for (int i = 0; i < len; i++) { if (strs[i].contains("7")) { sum++; continue; } arr[i] = Integer.parseInt(strs[i]); if (arr[i] % 7 == 0) { sum++; } } System.out.println(sum); } }
第二题:货运装箱问题
货轮最大重量C,有N个集装箱,每个集装箱重量W(i),对应货物价值V(i)。求货轮不超过最大载重的前提下装载货物总价值最大。
输入:第一行最大重量C,第二行每个集装箱重量W(i),第三行每个集装箱价值V(i)。
输出:货物总价值。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class q2 { public static void main(String[] args) throws IOException { // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int C = Integer.parseInt(str); String[] weights = br.readLine().split(","); String[] values = br.readLine().split(","); int n = weights.length; // 货物的数量 int[] w = new int[n]; int[] v = new int[n]; for (int i = 0; i < n; i++) { w[i] = Integer.parseInt(weights[i]); v[i] = Integer.parseInt(values[i]); } zeroOnePackage(n, C, w, v); } private static void zeroOnePackage(int n, int C, int[] w, int[] v) { int[][] f = new int[n + 1][C + 1]; for (int i = 1; i < n + 1; i++) { for (int j = 1; j < C + 1; j++) { if (w[i - 1] > j) { f[i][j] = f[i - 1][j]; } else { f[i][j] = Math.max(f[i - 1][j], f[i - 1][j - w[i - 1]] + v[i - 1]); } } } System.out.println(f[n][C]); } }
第三题:最短路径
图像从传感器到输出JPEG格式图片经过很多node处理,这些node构成一个图像处理的pipeline,其中的有些节点依赖于其他节点输出。A->B表示B的执行依赖于A。
假设每个node执行时间为A(t),即node A需要执行t秒,没有依赖的node可以并行执行。编写一个方法输入一个有向无环图pipeline,输出执行完需要的最短时间。
输入:第一行输入node的执行时间,第二行输入node的依赖关系。
输出:最短时间。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class q3 { public static void main(String[] args) throws IOException { // BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] strs = br.readLine().split(","); int len = strs.length; int[] times = new int[len]; for (int i = 0; i < len; i++) { times[i] = Integer.parseInt(strs[i]); } HashMap<Integer, ArrayList<Integer>> map = new HashMap<>(); strs = br.readLine().split(";"); for (int i = 0; i < len; i++) { String[] ss = strs[i].split(","); ArrayList<Integer> tmp = new ArrayList<>(); for (String s : ss) { tmp.add(Integer.parseInt(s)); } map.put(i + 1, tmp); } int res = solution(times, map); System.out.println(res); } private static int solution(int[] times, HashMap<Integer, ArrayList<Integer>> map) { int start = lookForStart(times, map); ArrayList<Integer> lengths = new ArrayList<>(); // 存储DFS每次遍历到末节点时的长度 Stack<Integer> stackElement = new Stack<>(); // 存储节点 Stack<Integer> stackLength = new Stack<>(); // 存储到这个节点时的值 stackElement.push(start); stackLength.push(times[start - 1]); while (!stackElement.isEmpty()) { int tmp = stackElement.pop(); int tmpLength = stackLength.pop(); ArrayList<Integer> tmpAdjacency = map.get(tmp); for (int i = tmpAdjacency.size() - 1; i >= 0; i--) { int nodeToPush = tmpAdjacency.get(i); if (nodeToPush == 0) { lengths.add(tmpLength); break; } stackElement.push(nodeToPush); stackLength.push(tmpLength + times[nodeToPush - 1]); } } Collections.sort(lengths); return lengths.get(lengths.size() - 1); // 找最小值,其实是返回最大值 } private static int lookForStart(int[] times, HashMap<Integer, ArrayList<Integer>> map) { boolean[] b = new boolean[times.length + 1]; Iterator<Map.Entry<Integer, ArrayList<Integer>>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<Integer, ArrayList<Integer>> e = iterator.next(); ArrayList<Integer> list = e.getValue(); for (int i : list) { b[i] = true; } } int res = 0; for (int i = 1; i < b.length; i++) { if (!b[i]) { res = i; } } return res; } }
全部评论
(2) 回帖