- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在尝试解决我教授笔记中的实践问题,但找不到最佳解决方案。以下是问题。
沿着一条东西向的街道,有 m 所公立学校,它们到街道西端的距离分别为 S[1] < S[2] < … < S[m]。除了 m 所学校外,还有 n 栋房子,它们到街道西端的距离分别为 H[1] < H[2] < … < H[n]。目前,任何家庭的学生都可以在 200 米的步行距离内找到一所学校。现在,因为预算不足,我们希望关闭一些学校。请设计一个 O(n+m) 贪心算法来选择最少数量的学校开放,这样任何家庭仍然可以找到其中一所选定的学校,步行距离在 200 米以内。你需要展示一个伪代码并证明你的算法的正确性。
最佳答案
高级思想
首先,我们知道解决方案总是存在的,只要不移除任何学校即可。
对于选择最少的学校,让我们换个角度思考:
For each house at h[i], think as a range
[h[i]-200, h[i]+200]
inclusively
因此,对于每个这样的范围,我们想在 s[j]
找到一些学校其中 h[i]-200 <= s[j] <= h[i]+200
同时 h[]
& s[]
排序好了,我们从最左边的房子开始看[h[0]-200, h[0]+200]
,我们必须为这所房子选择一所学校,直觉上,我们希望尽可能选择最右边的学校,因为这所学校有更高的机会 与隔壁房子分享
这个想法在一般情况下是正确的:
For range h[i], we always want to choose school which is already chosen school by h[i-?], or the rightmost non chosen school
正确性
设一个解是一个有序的学校集S
, 未通过描述的方法找到
让我们的贪心法找到的解决方案是一组有序的学校 G
考虑 S[0]
和 G[0]
, S[0] <= G[0]
因为我们为第一所房子选择了最合适的学校。然后要么
S[0] <= G[0] <= S[1]
, 我们可以替换 S[0]
通过 G[0]
提供相同的集合大小S[0] < S[1] < ... < S[X] <= G[0] <= S[X+1]
, 我们可以替换所有 S[X]
<= G[0]
通过 G[0]
,它提供了更小/更优化的尺寸(是的,案例 1 确实是案例 2 的子案例)
对于这两种情况,删除 G[0]
和任何 S[X] <= G[0]
,场景与两个缩减集相同,我们可以递归地使用类似的参数,说我们的贪婪方法不会比任何可能的解决方案都差,这是最优的
伪代码
Pointer house_pointer = first house, school_pointer = first school;
for( each house ){
if( NOT ( current school is chosen and within current house's range ) ){
while(current school is NOT the rightmost school within range){
school_pointer = current school = next school
}
mark current school chosen
}
house_pointer = next house
}
算法好像有两个循环,就是O(nm)
,但事实并非如此。对于这些使用双指针遍历数组的结构类型(例如 KMP algorithm
),通常您可以观察到每个元素被访问的最大 # 次。
对于房子,由于每次迭代都会移动到下一个房子,每个房子最多被访问 1 次。
对于学校来说,由于指针只向前移动而不会向后移动,所以每个学校最多也被访问 1 次,虽然在每个房屋迭代中分布不均匀(取决于实现,有些学校可能会访问 2 次但不是重要)
因此,结合两者,复杂度还是O(n+m)
关于algorithm - 修改后的附近学校/邮局示例的贪婪算法方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35638688/
因此,我尝试将以下两组格式分开: FIRST - GrouP second.group.txt 第一组可以包含任意字符第二组是点(.) 分隔的字符串。 我使用以下正则表达式来
几个星期以来,我一直在使用 php 中的正则表达式。现在我的问题是:有什么办法可以让 RegEx 贪婪 | 吗? 例如主题:012345abcdefghijklm pattern: /(abcde|a
先扫盲一下什么是正则表达式的贪婪,什么是非贪婪?或者说什么是匹配优先量词,什么是忽略优先量词? 好吧,我也不知道概念是什么,来举个例子吧。 某同学想过滤之间的内容,那是这么写正则以及程序的。 复制
之前已经简单介绍了Python正则表达式的基础与捕获,那么在这一篇文章里,我将总结一下正则表达式的贪婪/非贪婪特性。 贪婪 默认情况下,正则表达式将进行贪婪匹配。所谓“贪婪”,其实就
我对编程真的很陌生,我刚刚开始在哈佛的 CS50 上尝试一些问题集。如果有人能向我指出为什么我的代码是错误的,我将不胜感激。 编译并运行代码后,没有任何输出。 另一方面,有人可以向我解释一下“roun
寻求一些关于为什么运行如此奇怪的建议。超过 .25 的所有内容都可以正常工作,但是低于 .25 的任何内容都可以正常工作,我会得到一些非常奇怪的结果。怎么了? #include #include
这是我的 pset1 贪婪代码。现在,据我所知,这一切都有效,并且经过测试并使用了 cs50 检查... 问题是在演练中暗示了我必须查找如何正确使用 round,我也许应该在某个地方使用模块化?我明白
我在“分离”这些数据时遇到了一些麻烦。虽然辅助函数等是一个选项,但我真的很想只使用正则表达式来解决这个问题(并在匹配后处理匹配组)。 这是我拥有的(部分)数据: Belgium Belgium M_F
我正在编写一个程序,它接受输入并打印出使用的最少数量的硬币。当我运行程序并输入内容时,它没有按预期工作并且不打印任何内容。我在这里做错了什么? #include #include int main
我想抓取 对之间任何值的内容标签。 This is one block of text This is another one 我想出的正则表达式是 /(.*)/m 虽然,它看起来很贪心,并
这个问题在这里已经有了答案: Reference - What does this regex mean? (1 个回答) 关闭 1 年前。 最近,在网络*的某个地方,我找到了正则表达式的引用,它描
编译此代码时出现错误。 Z 是找零所需的最终硬币数量,目标是使用最少数量的硬币。我在顶部附近定义了int Z = 0。我尝试再次添加 int z 并将 print 语句中的类型更改为 f 但没有成功。
先扫盲一下什么是正则表达式的贪婪,什么是非贪婪?或者说什么是匹配优先量词,什么是忽略优先量词? 好吧,我也不知道概念是什么,来举个例子吧。 某同学想过滤之间的内容,那是这么写正则以及程序的。
我正在尝试为像 Farkle(贪婪)游戏这样的命令编写代码。这是计算机科学入门类(class)。简而言之,您掷出 6 个骰子,分数取决于您掷出的骰子。然后,您需要移除已使用的骰子 -> 显示该骰子的分
我已经提交了两个序列的LCS问题的代码草案。我在尝试贪婪时犯了严重的错误,现在我已经实现了我相信这个问题的稳定贪婪算法。虽然我有两个问题,在线类(class)的这一部分,当我提交它时它说序列 [1,2
我找到了这个tutorial关于正则表达式,虽然我直观地理解“贪婪”、“不情愿”和“占有”限定符的作用,但我的理解似乎存在严重漏洞。 具体来说,在以下示例中: Enter your regex: .*
我正在尝试制作一个程序,提供最少数量的硬币找零,但如果我给出的数字不是可分为四等分的数字,它就会惨败。例如,如果我输入 1.25,我会得到 5 个 25 美分,但如果我输入 1.26,我会得到 5 个
ϵ-贪婪策略 我知道 Q-learning 算法应该尝试在探索和利用之间取得平衡。由于我是该领域的初学者,因此我想实现一个简单版本的探索/利用行为。最佳 epsilon 值 我的实现使用 ϵ 贪婪策略
据我所知,epsilon 标志着探索和利用之间的权衡。一开始,你希望 epsilon 较高,这样你才能取得大的进步并学到东西。当您了解 future 的奖励时,epsilon 应该衰减,以便您可以利用
我是一名优秀的程序员,十分优秀!