You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求看完所有电影的最少天数:每日观影时长上限3.00

问题描述

给定一个存储电影时长的double数组,每日观影总时长上限为3.00,需计算看完所有电影所需的最少天数。
约束条件:

  • 每部电影时长满足 1.01 ≤ duration[i] ≤ 3.00
  • 每部电影仅能观看一次,可自由选择每日观看的影片组合

样例测试用例

  • 输入:duration[] = {1.01, 2.4, 1.01, 1.01, 1.4} → 输出:3
  • 输入:duration[] = {1.01, 2.4, 1.4, 1.6, 2.6, 1.7} → 输出:4
  • 输入:duration[] = {1.01, 2.4, 1.5, 1.6, 2.6, 1.7} → 输出:5

我的实现情况

这是校园招聘笔试中的题目,当时没能按时完成。后续我用递归实现了代码,能通过部分自定义测试用例,但不确定是否覆盖所有场景,同时希望优化时间复杂度,寻求帮助。

核心思路

由于每部电影时长≥1.01,每日最多只能观看2部电影(3部总时长必然超过3.00)。

代码实现

import java.util.ArrayList;

public class MoviesBetterSolution {

    public static void main(String[] args) {
        double arr[] = {2.0, 1.01, 1.4, 2.4, 1.71};  // 测试用例
        // days初始为1(从第1天开始),wtn(当日已观影时长)初始为0.00
        System.out.println(f(0, 0.00, 1, 3.00, new ArrayList<Integer>(), arr, 0));
    }   

    static int minDays = Integer.MAX_VALUE;

    // wtn: 当日已观影时长
    // taken: 当日已观看的电影数量
    // picked: 已观看的电影索引集合
    private static int f(int i, double wtn, int days, double limit, ArrayList<Integer> picked, double[] arr, int taken) {
        // 所有电影看完时,更新最小天数
        if (picked.size() == arr.length) {
            if (days < minDays) minDays = days;
            return minDays;  
        }

        // 遍历完数组时的处理
        if (i == arr.length) {  
            if (taken != 0) {     // 当日至少看了1部,重新遍历未观看影片,开启新遍历
                i = 0;         
                taken = 0;            
            } else {       // 当日未看电影,直接返回避免栈溢出
                return minDays;            
            }       
        }

        // 仅处理未观看且加入后不超当日时长上限的电影
        if ((wtn + arr[i] <= limit) && !picked.contains(i)) {  
            ArrayList<Integer> temp = (ArrayList<Integer>) picked.clone();
            temp.add(i);
            if (taken < 2) { // 当日最多看2部,继续在当日处理下一部
                f(i+1, wtn + arr[i], days, limit, temp, arr, taken+1);            
            }
            // 观看当前电影后直接结束当日,开启新一天
            f(0, 0, days + 1, limit, temp, arr, taken+1);        
        }

        // 不观看当前电影,继续处理下一部
        f(i+1, wtn, days, limit, picked, arr, taken);

        return minDays;   
    } 
}

内容的提问来源于stack exchange,提问作者Priyansh Gaurav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:48:16