【发布时间】:2013-08-30 00:46:55
【问题描述】:
我正在查看随机的 TopCoder 问题,以便在比赛中尝试和改进,我今天遇到了一个我想提供一些意见的问题。
问题陈述
泰迪喜欢玫瑰,特蕾西喜欢百合花。他们希望将这些花种在一个大花园里。
然而,镇上唯一的花店以vector<int>s 玫瑰和百合为代表的小包出售这些鲜花。第 i 个数据包包含 roses[i] 玫瑰和 lilies[i] 百合。每包只能购买一次。
泰迪和特蕾西想买一些花,把它们排列成一个矩形网格。这个网格的排列必须使每个单元格只包含一朵花,并且任何两个共享边的单元格必须包含不同种类的花。此外,泰迪和特蕾西必须使用他们购买的所有鲜花。
Teddy 和 Tracy 喜欢方形网格,所以他们想买一套小包,这样他们就可以将花朵排列成最方形的网格。更准确地说,他们希望将花朵排列成 R x C 网格,其中 R 和 C 是正整数,使得 |R-C| (|R-C| 表示 R-C 的绝对值)被最小化。返回此最小绝对值,如果不存在有效排列,则返回 -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 朵百合花。
当您考虑到矩形的每个单元格都必须用一朵花填充时,挑战显然就来了,因此您必须找到“最合适”的矩形,给定您拥有的花数量,满足两者:为其余的花提供足够的“中间”单元,并尽可能靠近正方形。
我查看了一些发布的解决方案,但是代码往往非常模糊和优化(就快速编写而言),因此很难提取作者对解决方案的想法.
如果有任何想法,我将不胜感激,我很想了解一些快速解决此类问题的方法。
【问题讨论】:
-
包数有什么限制?
-
@IVlad - 玫瑰和百合将包含相同数量的元素,介于 1 和 16 之间,包括 1 和 16。 - 玫瑰和百合的每个元素将在 0 到 10000 之间,包括在内。 - 以玫瑰和百合为代表的每包鲜花总数将大于0。