加载中...
LCP 12-小张刷题计划
发表于:2021-12-03 | 分类: 中等
字数统计: 740 | 阅读时长: 3分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/xiao-zhang-shua-ti-ji-hua

英文原文

中文题目

为了提高自己的代码能力,小张制定了 LeetCode 刷题计划,他选中了 LeetCode 题库中的 n 道题,编号从 0n-1,并计划在 m 天内按照题目编号顺序刷完所有的题目(注意,小张不能用多天完成同一题)。

在小张刷题计划中,小张需要用 time[i] 的时间完成编号 i 的题目。此外,小张还可以使用场外求助功能,通过询问他的好朋友小杨题目的解法,可以省去该题的做题时间。为了防止“小张刷题计划”变成“小杨刷题计划”,小张每天最多使用一次求助。

我们定义 m 天中做题时间最多的一天耗时为 T(小杨完成的题目不计入做题总时间)。请你帮小张求出最小的 T是多少。

示例 1:

输入:time = [1,2,3,3], m = 2

输出:3

解释:第一天小张完成前三题,其中第三题找小杨帮忙;第二天完成第四题,并且找小杨帮忙。这样做题时间最多的一天花费了 3 的时间,并且这个值是最小的。

示例 2:

输入:time = [999,999,999], m = 4

输出:0

解释:在前三天中,小张每天求助小杨一次,这样他可以在三天内完成所有的题目并不花任何时间。

 

限制:

  • 1 <= time.length <= 10^5
  • 1 <= time[i] <= 10000
  • 1 <= m <= 1000

通过代码

高赞题解

bool check(vector<int>& a, int t, int m){//每组累加和在<=t的情况下 能否在m组内分完
    int cnt = 1, rest = t,maxx = -1;//cnt为分的总组数 rest为当前组组剩余容量
    bool flag = true;//可以求助
    for(int i = 0; i < a.size(); i++){
        maxx = max(maxx,a[i]);//维护当前组的最大值
        if(rest >= a[i]) rest -= a[i];//能装下时就直接装
        else if(flag) flag = false,rest += maxx,i--;//装不下且可以求助时,把当前的最费时的那个拿去求助
        else cnt++, maxx = -1,flag = true, rest = t, i--;//装不下 且无法求助时 只能从第二天开始了(开始下一组)
    }
    return cnt <= m;//m组内能分完即可(=m天内能看完)
}
int minTime(vector<int>& time, int m) {
    int n = time.size();
    int l = 0, r = 0;
    for(int i = 0; i < n; i++) r += time[i];//获取一天最多耗时是多少
    while(l < r){//二分 T        l<= T <=r
        int T = l + r >> 1;
        if(check(time,T,m)) r = T;//判断在当前T的限制下能否在m天内看完 如果可以就减小T 即 r = T
        else l = T+1;
    }
    return r;
}

统计信息

通过次数 提交次数 AC比率
6841 16525 41.4%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
LCP 16-游乐园的游览计划
下一篇:
LCP 11-期望个数统计
本文目录
本文目录