如何从数组中得到所选数的cordinate

2024-04-28 09:09:44 发布

您现在位置:Python中文网/ 问答频道 /正文

你将得到一个面积为a的油漆。将有12个油漆桶从4个主要 每种颜色有3种色调(即总共12个桶)。桶的大小,或者更具体地说, 可以从每个阴影绘制的区域量在以下数组中给出。 同一原色的不同色调显示在同一行中。在

  • [12,23,14]
  • [10,30,15]
  • [16,22,35]
  • [14,24,20]

问题和约束

你需要选择4种颜色的地板

  1. 整个地板区域应涂漆;也不允许阴影重叠
  2. 从每一种原色中选择“一种且只有一种”的色调用于最终的绘画
  3. 浪费量最小化(即假设一旦我们打开并使用桶,任何 剩余部分将被丢弃)

实现一个python程序来解决以下问题

问题1。满足上述约束条件(如果A=100)的色阶(或桶)
问题2。上述情况下的损耗量
问题3。如果A=90,Q1和Q2的解决方案是什么?在

注意:您可以使用下面的符号来引用上面地图中的每个阴影。在

R-行索引
C列索引
(r,c)-(r+1)行和(c+1)列的阴影
e、 g.(0,0)->;12,(0,1)->;23,(1,2)->;15等

这样,Q1的答案可以用格式[(0,1),(1,2),(2,0),(3,2)]


如果用户输入100,系统应显示颜色代码区域,其坐标和最接近100

示例

Enter your Area = 100
100 ~ 101(sum of areas 12+30+35+24, There for 101 is the closet number to 100)

Shades          = [12 30 35 24]
Cordinates of shades = (0,0)(1,1)(2,2)(3,1)

这是我的应答码

^{pr2}$

输出-:

Enter your Area = 100

sum of shades   = 101
minimum wastage = 1
Shades          = [12 30 35 24]
Cordinates of shades = ( 0 , 0 )( 1 , 1 )( 2 , 2 )( 3 , 1 )

你可以看到我得到的坐标12 30 35 24是手动类型的。这不是一个好的编程方法。在

我怎样才能直接得到坐标(用更好的方法)?在

请注意,我已经回答了所有问题。我想要第三季度更好的答案


Tags: of答案gt区域yourarea色调sum
1条回答
网友
1楼 · 发布于 2024-04-28 09:09:44

优化搜索的唯一可能方法是在每次选择后删除重复的和值。很容易检查81个可能的损耗值中存在45个不同的值:

len(set(sum(el) for el in product(*colors)))
Out[99]: 45
len(list(sum(el) for el in product(*colors)))
Out[100]: 81

其中几乎有一半在sum方面重复,这对于您的计算来说是不必要的权重。但这并不是一个很大的提速。这在很大程度上取决于运行代码的数据的质量,主要是每个列表的值的宽度和列表的数量。在

我已经整理了您的代码,使其更加高效和可读:

^{pr2}$

代码的“核心”在get_shades函数中。我删除了sum(element)的双重计算,并将双重比较放在一行中以使其更具可读性。顺便说一下,可以用100%函数风格重写get_shades函数,如下所示:

def get_shades(colors, area, max_tot):
    # functional version of get_shades
    def cmp(x):
        # compares items based on their sum; bad items are largest by default
        s = sum(x)
        if s >= area: return s
        else: return max_tot + 1
    return min(product(*colors), key = cmp)

但是,正如你提到的,这还不够。您可能希望通过在每次选择后删除重复的和来减少它:

[[12, 23, 14], [10, 30, 15]] -> [22, 24, 27, 29, 33, 38, 42, 44, 53] # 9 distinct sum values
[[22, 24, 27, 29, 33, 38, 42, 44, 53], [16, 22, 35]] -> # 24 distinct sum values
[[...], [14, 24, 20]] -> 45 distinct sum values

这是reduce方法设计的一个很好的例子。每次迭代后,它取最后一个结果,对下一个项执行计算,并用新结果替换它。可以使用以下方法获取所有可能的45个总和值:

wastages = reduce(lambda x,y: set(sum(n) for n in product(x, y)), colors)

并通过以下方法求出所需的最小值:

min(wastages, key = cmp)

其中cmp是这样定义的:

def cmp(x):
    if x >= area: return x
    else: return max_tot + 1

但另一个大问题是:与它们的总和不同,阴影不会保存在内存中。需要额外的函数来保持着色和和之间的映射。这需要先进的处理列表的方法,这种方法似乎相当慢,而不是加速。我把它们排除在范围之外,因为映射需要更困难的算法,而且它们只有在数据大于发布的数据时才有用。在

相关问题 更多 >