华为题:在规定时间内完成任务的分配使得收益最大

很巧妙的贪心,直接看代码以及debug就可以
public class Main {public static void main(String[] args) {int[] sla = new int[]{1, 1, 3, 3, 2, 2, 6};int[] val = new int[]{6, 7, 2, 1, 4, 5, 1};ArrayList<int[]> ints = new ArrayList<>();for (int i = 0; i < val.length; i++) {ints.add(new int[]{i, sla[i], val[i]});}Main main = new Main();main.greedy(ints);}// datas: [id, deadlines, values]public void greedy(ArrayList<int[]> datas) {int len = datas.size();System.out.println(len);// 降序排列datas.sort(((o1, o2) -> o2[2] - o1[2]));datas.forEach(o -> {System.out.println(Arrays.toString(o));});// 求和int sum = datas.stream().mapToInt(data -> data[2]).sum();System.out.println(sum);// 占位,代表的是0-6这七个时间点,每一个时间点只能有一个任务// 每个时间点只能有一个任务,因为每个任务需要一个小时完成int[] routs = new int[len];Arrays.fill(routs, -1);int punish = 0;// 对于每一个任务,三维的数据for (int[] data : datas) {// 从该任务的截止日期前一小时开始遍历空位,因为需要一小时进行解决for (int j = data[1] - 1; j >= 0; j--) {// 如果存在空位的话,占最前面的一个位置,将id放入占位if (routs[j] == -1) {routs[j] = data[0];break;}// 如果遍历到最后都没有空位了,就说明这个选不到,记为不需要的,最后减// 不需要与空位中的数据进行比较的原因是,进行了降序排列if (j == 0)punish += data[2];}}System.out.println(sum - punish);}}
