Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

  • 链表

  • 字符串

  • 二叉树

  • 动态规划

  • 深搜回溯

  • 数学贪心

    • LCP 33. 蓄水
    • 6455. 使所有字符相等的最小成本
    • 55. 跳跃游戏
    • 2517. 礼盒的最大甜蜜度
    • 2611. 老鼠和奶酪
    • 6449. 收集巧克力
    • 1401. 圆和矩形是否有重叠
    • 2178. 拆分成最多数目的正偶数之和
    • 376. 摆动序列
    • 649. Dota2 参议院
    • 630. 课程表 III
    • 2136. 全部开花的最早一天
      • 1.贪心+调度优化
        • 考虑是否有必要交替播种?
        • 播种顺序
    • 2731. 移动机器人
  • 堆栈队列

  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 数学贪心
phan
2023-10-07
目录

2136. 全部开花的最早一天

# 2136. 全部开花的最早一天 (opens new window)

# 1.贪心+调度优化

本题主要考验调度思路,以及思维角度。

# 考虑是否有必要交替播种?

显然只看播种时间,由于播种行为只能串行进行,因此总播种时间是固定的。

假设存在某一种最优化的交替播种1122312321,那么这种情况实际上可以优化为3322221111,可以发现后者播种方式中3号和2号的生长期都被提前,因此后一种播种顺序必定是优于交替播种方式(总时间小于等于交替播种)。

# 播种顺序

经过前面讨论可以得知,调度序列必然是i,i,i,k,k,k,j,j,j...也就是播种完一种植物后,再播种另一种植物。因此最终问题就落到了应该以什么顺序播种的问题?

直观上来想,我们尽可能的希望“生长时间”长的植物优先播种,这样在生长时间内播种越多植物,那么总时间应该是越少的。——经过证明也确实如此。

总时间=播种时间之和+“并行生长时间”。其中并行生长时间中,当多个植物的生长时间并行程度越高,这部分花的时间必定越少。

class Solution {
    public int earliestFullBloom(int[] plantTime, int[] growTime) {
        Integer[] nums=new Integer[plantTime.length];
        for(int i=0;i<nums.length;i++){
            nums[i]=i;
        }
        Arrays.sort(nums,new Comparator<Integer>(){
            public int compare(Integer o1,Integer o2){
                return growTime[o2]-growTime[o1];
            }
        });
        int res=0,curr=0;
        for(int i=0;i<nums.length;i++){
            int inx=nums[i];
            res+=plantTime[inx];
            if(plantTime[inx]+growTime[inx]>curr){
                curr=growTime[inx];
            }
            else{
                curr-=plantTime[inx];
            }
        }
        return res+curr;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
编辑 (opens new window)
#Leetcode
上次更新: 2023/12/15, 15:49:57
630. 课程表 III
2731. 移动机器人

← 630. 课程表 III 2731. 移动机器人→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式