我正在查看随机的 TopCoder 问题,以便在比赛中尝试和改进,我今天遇到了一个我想提出一些意见的问题。
问题陈述
泰迪喜欢玫瑰,特蕾西喜欢百合花。他们希望将这些花种在一个大花园里。
然而,镇上唯一的花店以vector<int>
玫瑰和百合为代表的小包出售这些鲜花。第 i 个数据包包含 roses[i] 玫瑰和 lilies[i] 百合。每包只能购买一次。
泰迪和特蕾西想买一些花,把它们排列成一个长方形的格子。这个网格的排列必须使每个单元格只包含一朵花,并且任何两个共享边的单元格必须包含不同种类的花。此外,泰迪和特蕾西必须使用他们购买的所有鲜花。
泰迪和特蕾西喜欢方形网格,所以他们想买一套小包,这样他们就可以把花排列成最方形的网格。更准确地说,他们希望将花朵排列成 R x C 网格,其中 R 和 C 是正整数,使得 |RC| (|RC| 表示 RC 的绝对值)被最小化。返回此最小绝对值,如果不存在有效排列,则返回 -1。
定义
班级: BuyingFlowers
方法: buy
参数: vector <int>, vector <int>
回报: int
方法签名: int buy(vector <int> roses, vector <int> lilies)
例子
{2, 4}
{4, 2}
回报:1
购买所有的包以获得 6 朵玫瑰和 6 朵百合花,他们可以创建一个 3 x 4 的网格,排列如下:
RLRL
LRLR
RLRL
这种排列的高度和宽度之差为 1。
到目前为止我的想法
所以到目前为止,我对这个问题有几个想法,我认为这可能对解决它很重要。随意忽略它们。
由花朵创建的每个矩形的周边都会有偶数朵玫瑰和百合花。所以你可以用花做的最大矩形可以通过取两者中较小的一个来找到玫瑰和 4 朵百合花。
当您考虑到矩形的每个单元格都必须填充一朵花时,挑战显然就来了,因此您必须找到“最合适”的矩形,考虑到您拥有的花数量,这将满足两者:提供足够的“中间” ” 其他花的单元格,并尽可能靠近正方形。
我查看了一些发布的解决方案,但是代码往往非常模糊和优化(就快速编写而言),因此很难提取作者为解决方案考虑的概念。
我会很感激任何想法,我很想了解一些快速解决此类问题的方法。