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

image.png
很巧妙的贪心,直接看代码以及debug就可以

  1. public class Main {
  2. public static void main(String[] args) {
  3. int[] sla = new int[]{1, 1, 3, 3, 2, 2, 6};
  4. int[] val = new int[]{6, 7, 2, 1, 4, 5, 1};
  5. ArrayList<int[]> ints = new ArrayList<>();
  6. for (int i = 0; i < val.length; i++) {
  7. ints.add(new int[]{i, sla[i], val[i]});
  8. }
  9. Main main = new Main();
  10. main.greedy(ints);
  11. }
  12. // datas: [id, deadlines, values]
  13. public void greedy(ArrayList<int[]> datas) {
  14. int len = datas.size();
  15. System.out.println(len);
  16. // 降序排列
  17. datas.sort(((o1, o2) -> o2[2] - o1[2]));
  18. datas.forEach(o -> {
  19. System.out.println(Arrays.toString(o));
  20. });
  21. // 求和
  22. int sum = datas.stream().mapToInt(data -> data[2]).sum();
  23. System.out.println(sum);
  24. // 占位,代表的是0-6这七个时间点,每一个时间点只能有一个任务
  25. // 每个时间点只能有一个任务,因为每个任务需要一个小时完成
  26. int[] routs = new int[len];
  27. Arrays.fill(routs, -1);
  28. int punish = 0;
  29. // 对于每一个任务,三维的数据
  30. for (int[] data : datas) {
  31. // 从该任务的截止日期前一小时开始遍历空位,因为需要一小时进行解决
  32. for (int j = data[1] - 1; j >= 0; j--) {
  33. // 如果存在空位的话,占最前面的一个位置,将id放入占位
  34. if (routs[j] == -1) {
  35. routs[j] = data[0];
  36. break;
  37. }
  38. // 如果遍历到最后都没有空位了,就说明这个选不到,记为不需要的,最后减
  39. // 不需要与空位中的数据进行比较的原因是,进行了降序排列
  40. if (j == 0)
  41. punish += data[2];
  42. }
  43. }
  44. System.out.println(sum - punish);
  45. }
  46. }