Algorithm Hackerrank上组织球容器问题的求解逻辑

Algorithm Hackerrank上组织球容器问题的求解逻辑,algorithm,Algorithm,我在Hackerrank上解决这个问题: 大卫有几个容器,每个容器里都有许多球。他 刚好有足够的容器将每种球分类到它的 自己的集装箱。大卫想用他的排序方法对球进行排序 例如,David有n=2个容器和2种不同类型的容器 两个球的编号从0到n-1=1。这个 每个容器中球类型的分布用n x n表示 整数矩阵,M[容器][类型]。例如,考虑 下面是M=[[1,4],[2,3]]的示意图: [……] David希望执行一些交换操作,以便: 每个容器只包含相同类型的球。 没有两个相同类型的球位于不同的容器

我在Hackerrank上解决这个问题:

大卫有几个容器,每个容器里都有许多球。他 刚好有足够的容器将每种球分类到它的 自己的集装箱。大卫想用他的排序方法对球进行排序

例如,David有n=2个容器和2种不同类型的容器 两个球的编号从0到n-1=1。这个 每个容器中球类型的分布用n x n表示 整数矩阵,M[容器][类型]。例如,考虑 下面是M=[[1,4],[2,3]]的示意图:

[……]

David希望执行一些交换操作,以便:

每个容器只包含相同类型的球。 没有两个相同类型的球位于不同的容器中。 必须执行q查询,其中每个查询都以 矩阵,M。对于每个查询,如果需要,可以在新行上打印 对于给定的矩阵,可以满足上述条件。否则 无法打印

我尝试了各种方法来解决这个问题,但都找不到。然后我转到问题的讨论部分,我发现了这种方法-

制作一张表格,列出每个箱子的总容量 制作一张表,列出每种球类型的球总数 对两张表进行排序 如果它们相同,则可能打印,否则不可能打印。 我尝试了这个,它工作正常,通过了所有测试用例。我只是不理解另一个用户提到的这个算法背后的逻辑。我只是想有人帮我解决这个问题的逻辑,更好的解决方案也会非常有益,因为我是这类问题的初学者

我为此编写的代码是

def组织容器容器: 印刷容器 countByType=[0]*lencontainer[0] countByContainer=[容器中x的sumx] 对于容器中的Ci: 打印Ci=,Ci 对于rangelenCi中的j: 打印j=,j countByType[j]+=Ci[j] countByContainer.sort countByType.sort 打印“按类型计数:”,按类型计数 打印“按容器计数:”,按容器计数 如果countByContainer==countByType,则返回可能,否则不可能
从挑战的描述来看,容器可能具有不同的容量可能并不明显。给出的所有示例都有相同大小的容器。为了更好地理解这个问题,我发现使用具有不同大小容器的示例非常有用:

         \ball types | red | blue | green
containers\          |     |      |    
---------------------+-----+------+-------
           A         |  2  |   3  |   1
           B         |  4  |   0  |   1
           C         |  1  |   3  |   3
我们有3个容器,分别是A,B和C,还有3种球,红色,蓝色,绿色。注意容器B是最小的:显然它可以包含5个球。A可以包含6个球,C可以包含7个球

一个关键的观察结果是,如果我们首先清空容器,然后将球自由地分布在容器上,再次填充它们,那么总有一种方法可以通过交换来实现相同的转换。您可能需要一点时间来了解这一点,并验证情况是否确实如此。但是一旦你掌握了这个原理,你就可以忘记交换的部分,从一个角度来处理这个问题,首先移除所有的球,然后再次分配它们

让我们清空容器。然后,我们手中有以下球:

 red | blue | green
-----+------+-------
  7  |   6  |   5
现在问问你自己:如果容器B的容量是5,你会把哪种球放进去?显然是绿球。它不适用于任何其他类型的球,因为您必须将一个或多个球放在另一个容器中,这违反了要求


因此,一般规则是:将你拥有的最少的球放在容量最小的容器中。如果球的数量与容量不匹配,那么就没有办法找到解决方案。如果它确实匹配,那么您可以对下一种球以递增的顺序重复此操作,并对下一个容器以递增的容量重复此操作。因此,你可以看到,像这样对容器和球进行实际分类是找到解决方案的一种方法。

从挑战的描述来看,容器可能具有不同的容量,这可能不是很明显。给出的所有示例都有相同大小的容器。为了更好地理解这个问题,我发现使用具有不同大小容器的示例非常有用:

         \ball types | red | blue | green
containers\          |     |      |    
---------------------+-----+------+-------
           A         |  2  |   3  |   1
           B         |  4  |   0  |   1
           C         |  1  |   3  |   3
我们有3个容器,分别是A,B和C,还有3种球,红色,蓝色,绿色。注意容器B是最小的:显然它可以包含5个球。A可以包含6个球,C可以包含7个球

一个关键的观察结果是,如果我们首先清空容器,然后将球自由地分布在容器上,再次填充它们,那么总有一种方法可以通过交换来实现相同的转换。您可能需要一点时间来了解这一点,并验证情况是否确实如此。但是一旦你掌握了这个原理,你就可以忘记交换部分,从一个 首先移除所有球,然后再次分发它们

让我们清空容器。然后,我们手中有以下球:

 red | blue | green
-----+------+-------
  7  |   6  |   5
现在问问你自己:如果容器B的容量是5,你会把哪种球放进去?显然是绿球。它不适用于任何其他类型的球,因为您必须将一个或多个球放在另一个容器中,这违反了要求

因此,一般规则是:将你拥有的最少的球放在容量最小的容器中。如果球的数量与容量不匹配,那么就没有办法找到解决方案。如果它确实匹配,那么您可以对下一种球以递增的顺序重复此操作,并对下一个容器以递增的容量重复此操作。你可以看到,像这样对容器和球进行分类是找到解决方案的一种方法