用餐问题:
几家人一起出去吃饭。为了增加他们的社会交往,他们愿意坐在桌子上,这样同一家庭的两个成员就不会在同一张桌子上。假设晚餐特遣队有p
家庭,而i
家庭有a(i)
成员。另外,假设有q
桌可用,并且j
第1桌的座位容量为b(j)
。
问题是:我们可以坐在桌子上的最多人数是多少?
编辑:创建一个图并运行最大流算法可以解决这个问题。但如果我们用Dinic算法有2*10^3个顶点,则全局复杂度为O(10^6*10^6)=O(10^12)。
如果我们总是以贪婪的方式坐在较大的群体前面。复杂度为O(10^6)。
所以我的问题是:
1)这个问题中贪婪的方法有效吗?
2)解决该问题的最佳算法是什么?
很容易想出这样的座位根本不可能的例子,所以这里有一个伪代码来解决这个问题,假设这个问题是可解的:
Sort each family i by a(i) in decreasing order
Add each table j to a max-heap with b(j) as the key
For each family i from the sorted list:
Pop a(i) tables from max-heap
Add one member of i to each table
Add each table j back into the max-heap with b(j) = b(j) - 1
设n=a(1)+a(2)+...+a(p)
(即总人数)
假设max-heap使用二进制堆,则时间复杂度为:
O(plog(p))
O(qlog(q))
O(nlog(q))
给出O(plog(p)+qlog(q)+nlog(q))
的总时间复杂度,其中O(nlog(q))
可能占主导地位。
由于我们处理的是整数,如果我们对max-heap使用一个1D bucket系统,使得c
是最大的B(j)
,那么我们将只得到O(n+c)
(假设max-heap操作占主导地位),这可能更快。
最后,请投票给大卫的答案,因为证明是必需的,而且是很棒的。
贪婪 vs 不贪婪 当重复一个正则表达式时,如用 a*,操作结果是尽可能多地匹配模式。当你试着匹配一对对称的定界符,如 HTML 标志中的尖括号时这个事实经常困扰你。匹配单个 HTML 标志的模式不能正常工作,因为 .* 的本质是“贪婪”的 #!python >>> s = '<html><head><title>Title</title>' >>> len(s) 32 >>> print re.
本文向大家介绍贪婪算法相关面试题,主要包含被问及贪婪算法时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。贪婪算法并没有固定的算法解决框架,算法的关键是贪婪策
输入是实数x1、x2、…、x2n的序列。我们想把这些数字配对成n对。对于第i对(i=1,2,…,n),让Si表示该对中的数字之和。(例如,如果将x(2i−1) 并且x2i作为第i对,Si=x(2i−1) x2i)。我们希望将这些数字配对,以使Maxi[Si]最小化。设计一个贪婪算法来解决这个问题。 这就是问题所在;我的解决方案是简单地对数字进行排序,并将前一个元素与后一个元素配对,加一个/减一个索
有人有线索为什么它对案件2不起作用吗?非常感谢你的帮助。编辑:案例2的预期结果是6130美元。我好像得到了6090美元。
我在读关于贪婪问题的两个属性,我试图理解以下两者之间的区别 最优子结构性质:最优全局解包含其所有子问题的最优解 贪婪选择性质:通过贪婪地选择局部最优选择,可以获得全局最优解 两者不是等价的吗?这两者似乎是一回事;能不能举个例子,最优子结构满足,贪婪选择不满足?以及一个贪婪选择得到满足而最优子结构没有得到满足的例子?
本文向大家介绍php正则表达式中贪婪与非贪婪介绍,包括了php正则表达式中贪婪与非贪婪介绍的使用技巧和注意事项,需要的朋友参考一下 一、贪婪与非贪婪 什么叫贪婪,比如说要从字符串中<td>面包一</td><td>面包二</td>吃面包,本来你只可以吃面包一,可是你贪心,于是就把第一个<td>到最后一个</td>里面的两个面包取出来了,你想多吃点,非贪婪也就是你不贪吃了,就只吃面包一。 我们来看看正