选择电影场景


12

介绍

最后,电影公司为您的电影筹集资金。他们给了您最大的预算,还设置了电影的放映时间。

现在,您可以开始进行预生产。您已经计划了一堆场景,但是并非所有场景都适合预算,因此电影的拍摄时间也会太长。您知道每个场景的重要性。您的目标是选择场景,使电影不会太贵,太长而平庸。

输入值

您得到了,running time并且budget工作室已经批准:

[25, 10]

您具有的场景列表包括running timecosts以及importance每个场景的:

[ [5, 2, 4], [7, 1, 3] ]

如果阵列不适合您,请选择另一种最适合您的输入格式。时间以分钟为单位。预算和成本以数百万随机货币计。重要性在到的范围内[1–9]。所有数字均为整数。

输出量

在以下情况下,输出要包括在影片中的场景列表:

  • 的总和importance最大。
  • 费用不超过预算。
  • 长度在允许的运行时间的±5分钟范围内。

场景的顺序无关紧要,不需要保留。

您可以输出数字列表或数组。您的输出可以具有从零开始或从一开始的索引:

[0,2,5] – 0, 2, 5 – 0 2 5
[1,3,6] – 1, 3, 6 – 1 3 6

可能有多种解决方案适用于任何给定的输入。您只需要找到一个。

约束条件

  • 场景不能缩短,也不能便宜。
  • 每个场景只能包含一次。

要求

  • 您的程序必须在电影的实际长度之内完成。
  • STDIN命令行参数,函数参数或最接近的等效参数都接受输入。
  • 您可以编写程序或函数。如果它是匿名函数,请提供如何调用它的示例。
  • 这是因此最短答案以字节为单位。
  • 不允许出现标准漏洞。

电影

您的第一部电影是一部关于德国小镇Knapsack 1的纪录片。由于70年代的环境限制,这座城市被重新安置:

Movie: [25, 10]

Scenes: [
    [5,  2, 4],
    [5,  5, 7],
    [7,  1, 3],
    [8,  5, 3],
    [12, 3, 9],
]

可能的解决方案,包括运行时间22,预算10和重要性20

0, 1, 4

您的下一个项目是Fargo的一集:

Movie: [45, 25]

Scenes: [
    [2,  1, 1],
    [8,  5, 9],
    [10, 6, 8],
    [10, 3, 6],
    [10, 9, 7],
    [11, 4, 3],
    [19, 5, 6],
]

可能的解决方案,包括运行时间40,预算24和重要性31

0, 1, 2, 3, 4

最后,这是电影的场景,其中“ M. McConaughey前往遥远的星系,却发现Matt Damon首先到达那里。 ”:

Movie: [169, 165]

Scenes: [
    [5,  8,  2],
    [5,  20, 6],
    [6,  5,  8],
    [6,  10, 3],
    [7,  6,  5],
    [7,  9,  4],
    [7,  8,  9],
    [7,  9,  5],
    [8,  6,  8],    
    [8,  8,  8],
    [8,  5,  6],
    [9,  5,  6],
    [9,  8,  5],
    [9,  4,  6],
    [9,  6,  9],
    [9,  8,  6],
    [9,  7,  8],
    [10, 22, 4],
    [10, 12, 9],
    [11, 7,  9],
    [11, 9,  8],
    [12, 11, 5],
    [15, 21, 7],
]

可能的解决方案,包括运行时间169,预算165和重要性133

1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22

1挑战的问题与实际语言环境之间的任何相似之处完全是巧合。

Answers:


4

MATLAB,100字节

function X=o(m,s) 
X=find(bintprog(-1*s(:,3),[s(:,2)';s(:,1)';-1*s(:,1)'],[m(2);m(1)+5;5-m(1)])==1);

二进制优化问题通过Matlab2013b中提供的bintprog函数解决。在较新的Matlab版本中,此函数已由intlinprog取代。

输入是用于电影约束的矢量(m),以及场景的矩阵(s)。特别是,m是两元素行向量[running_time budget],而s是Nx3矩阵,其中N是场景数,每一行都由[running_time成本重要性]组成。


2

Python 3中,211个 197字节

该解决方案从所有场景的组合一直到所有一个场景的组合,再到每个场景的组合,再进行暴力选择,然后选择具有最高重要性的场景组合。使用暴力破解是因为时间成本不是特别高,尽管肯定是指数级的。输出为零索引。

from itertools import*
def m(t,b,s):l=len(s);r=range(l);f=lambda y,k:sum(s[q][k]for q in y);return max([j for i in r for j in combinations(r,l-i)if t-6<f(j,0)<t+6and f(j,1)<=b],key=lambda n:f(n,2))

开球:

import itertools
def movie_scenes(time, budget, scenes):
    length = len(s)
    r = range(length)
    f = lambda film_list, index: sum(scenes[q][index]for q in film_list)
    importance = 0
    possible_films = []
    for num_scenes in r:
        for film in itertools.combinations(r, num_scenes):
            run_time = f(film, 0)
            cost = f(film, 1)
            if time-6 < run_time < time+6 and cost <= budget:
                possible_films.append(film)
    return max(possible_films, key = lambda film: f(film, 2)

感谢您成为第一个提出一种-实际上甚至是两种-不使用内置方法的方法,并感谢您对该问题的关注。
插入用户名

@insertusernamehere不客气:)
Sherlock9

1

Haskell,125个字节

(m,n)&s=snd$maximum[(sum i,q)|q<-filter(>=0)<$>mapM(:[-1])[0..length s-1],(t,b,i)<-[unzip3$map(s!!)q],sum b<=n,abs(sum t-m)<6]

用法示例:(25,10) & [(5,2,4),(5,5,7),(7,1,3),(8,5,3),(12,3,9)]-> [0,1,4]

怎么运行的:

let m be the running time
    n    the budget
    s    the list of scenes


    q<-filter ... s-1]                         -- loop q through the list of
                                               -- subsequences of the indices of s
                                               -- (0 based) -- details see below
                          map(s!!)q            -- extract the elements for the
                                               -- given indices                   
                    unzip3                     -- turn the list of triples
                                               -- into a triple of lists
          (t,b,i)<-[               ]           -- bind t, b and i to the lists
                                    sum b<=n   -- keep q if the sum of budgets <= n
                              abs(sum t-m)<6   -- and the time is within range
  (sum i,q)                                    -- for all leftover q make a pair
                                               -- (overall importance, q)
sum$maximum                                    -- find the maximum and drop
                                               -- overall importance


subsequence building:

                   [0..length s-1]         -- for all indices i of s
            (:[-1])                        -- make a list [i,-1]
        mapM                               -- and make the cartesian product
                                           -- e.g. [0,1] -> [[0,-1],[1,-1]] ->
                                           -- [[0,1],[0,-1],[-1,1],[-1,-1]]
filter(>=0)<$>                             -- drop all -1
                                           -- -> [[0,1],[0],[1],[]]

不久前在@xnor 的答案中找到了子序列技巧。它比subsequence要求的要短import Data.List


1

红宝石,172个 166 165字节

在发布这些Python答案之前,我应该真正开始检查我的Python答案的Ruby版本是否更适合高尔夫。无论如何,这是与以前相同的蛮力优化方法。欢迎打高尔夫球,包括涉及一些实际优化技术的技巧。

->t,b,s{l=s.size;r=[*0...l];f=->y,k{y.reduce(0){|z,q|z+s[q][k]}};v=[];r.map{|i|r.combination(l-i).map{|j|v<<j if(t-5..t+5)===f[j,0]&&f[j,1]<=b}};v.max_by{|n|f[n,2]}}

取消高尔夫:

def movie(time, budget, scenes)
  len = scenes.size
  range = [*0...len]
  f = -> y,k {y.reduce(0) {|z,q| z + s[q][k]}}
  potential_films = []
  range.map do |i|
    range.combination(len-i).map do |j|
    # len - i because range being combined must be 0..(len-1) as these are indices
    # but the number of elements in the combinations must be 1..len 
      if (time-5..time+5).include?(f[j,0]) && f[j,1] <= budget
        potential_films << j
      end
    end
  end
  return potential_films.max_by{|n|f[n,2]}
end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.