回答
pajton发表了评论。
让我详细说明。
正如pajton所说,这可以通过锦标赛选择来完成。
认为这是一场淘汰单打网球比赛,其中球员的能力有严格的顺序,比赛的结果完全由该顺序决定。
在第一轮的一半人被淘汰。在下一轮另一半等(有些可能)。
最终胜利者决定在最后一轮和最后一轮。
这可以看作是一棵树。
树的每个节点将成为该节点的子节点之间匹配的胜者。
叶子是球员。第一轮的获胜者是叶子的父母等。
这是n个节点上的完整二叉树。
现在按照赢家的路线。有赢家玩过的日志n比赛。现在考虑那些log n匹配的输家。第二好的必须是其中最好的。
获胜者在n-1场比赛中决定(每场比赛你击倒一场),logn中的获胜者由logn-1比赛决定。
因此,您可以决定在n + logn - 2比较中的最大和第二大。
事实上,它可以证明这是最佳的。在最坏的情况下,任何比较计划中,获胜者都必须进行logn比赛。
为了证明假设一个点系统,比赛结束后胜者获得输家的积分。最初,所有人都以1分开始。
最后的胜利者有n分。
现在给出了任何算法,它可以被安排,让更多点的玩家永远是赢家。由于在任何比赛中任何人的得分都至少翻番,所以在最糟糕的情况下,您至少需要获胜者出示记录n场比赛。
嘿,我没有给出答案,因为它迟到了,我要睡了:)。尽管你做得很好! – pajton 2011-04-17 13:45:04
@paj:谢谢!我只是好奇,这是我承认你首先回答它的方式:-)我会删除那部分。 – 2011-04-17 18:06:40
这有问题吗?这是至多3n比较(不包括i < n
比较)。如果你数一数,那就是4n(或者在第二个例子中是5n)。
double first = -1e300, second = -1e300;
for (i = 0; i < n; i++){
if (a[i] > first){
second = first;
first = a[i];
}
else if (a[i] > second && a[i] < first){
second = a[i];
}
}
另一种方式来编写它:
for (i = 0; i < n; i++) if (a[i] > first) first = a[i];
for (i = 0; i < n; i++) if (a[i] < first && a[i] > second) second = a[i];
- 1. 查找号码或第二大号码
- 2. PSEUDO代码和Python用于查找最大,第二大和最小号码
- 3. 找到比定义的参数号码大的最小号码
- 4. 找到用户输入的最大号码和最小号码(方法)
- 5. 找到最大号码。图的边缘
- 6. 查找n个号码的模式
- 7. C++最大号码验证
- 8. 如何找到最大号码
- 9. 查找号码
- 10. 查找号码括号内
- 11. 发生客户号码(号码)最大的时间在表
- 12. 找到另一个号码的号码?
- 13. 来自大量电话号码的电话号码是另一个电话号码的前置号码?
- 14. 查找和spilit号码
- 15. jquery查找另一个号码的下一个/最接近的多个号码
- 16. 最大距离的订单号码集
- 17. 大号码,输入的char []
- 18. 产生10个号码和移动第一个号码到最后10次
- 19. 查找公寓号码和楼层号码
- 20. 表格输入号码最大变量
- 21. Python列表大于号码
- 22. 返回第1个最大和第2个最大号
- 23. 查找IMEI号的代码
- 24. 查找Kaprekar的号码
- 25. 寻找离开最小剩余部分的最大号码
- 26. Python的 - 检查列表中的号码是一个号码
- 27. 使用grep查找其他号码之间的特定号码
- 28. 查找号码cerain值
- 29. 按行查找号码。 Javascript
- 30. ContactsContract查找电话号码
你想实际的算法,或线索(即某种作业帮助。)? – 2011-04-17 03:08:03
我想看看实际的算法。这不是家庭作业,而是我的一位同事的问题。 – Philip 2011-04-17 03:13:16
这被称为锦标赛选择算法。你可以阅读更多的例子在这里:http://geeksforgeeks.org/?p=11556 – pajton 2011-04-17 03:16:44