- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试创建一个网球锦标赛模拟器,其中比赛的结果是随机的(某种程度上)。大满贯赛事共有 128 名选手,其中 32 名是种子选手。目前我正在尝试将种子放在抽签中的适当位置。我根据正态分布(这将代替他们的排名)生成球员的实力,并将它们存储在升序排序的 std::array 中。我想简单地将平局最初表示为 vector<double> Draw(128)
.理想情况下,我会有一个算法将每个玩家放在平局中的正确位置,但我还没有想出一个,所以我决定只将位置输入一个数组并根据需要选择合适的数组关于锦标赛中有多少玩家。
位置如下:0,127,95,32,64,96,31,63,16,112,79,48,15,111,80,47,41,72,8,119,23,104,55,87,71,39 ,24,7,56,88,103,120
以32的倍数表示的前几项是:0*32,4*32-1,3*32-1,1*32,2*32,3*32,1*32-1 ,2*32-1,0.5*32,3.5*32-1,2.5*32-1,1.5*32,0.5*32-1,3.5*32,2.5*32.
我还没有从中找出一个模式。这有已知的算法吗?
最佳答案
基本算法说明:
假设您想在 8 人锦标赛中安排 4 名选手。
[ ][ ][ ][ ][ ][ ][ ][ ] 8 empty positions
让第一个球员成为种子很容易,我们把他放在哪里并不重要。我们把他放在开头,这样算法就更容易了。
[1][ ][ ][ ][ ][ ][ ][ ]
如果我们想为第二个玩家播种,我们需要将整个 field 分成两部分。位于左侧的玩家只会在决赛中遇到来自右侧的玩家。因此,第二名选手必须放在正确的位置,这样两个最好的选手才不会在决赛前相遇。我们再次将播放器放在他的部分的开头。
[1][ ][ ][ ] [2][ ][ ][ ]
现在我们再次拆分这两个部分,并将第三个和第四个玩家放入新的空白部分。现在第三名选手将在半决赛中遇到第一名选手。
[1][ ] [3][ ] [2][ ] [4][ ]
请注意算法将奇数放在左边,偶数放在右边。现在可以用随机玩家填充空单元格。该算法与@Nico Schertler 建议的算法基本相同。
编程:
我的想法是定义一个函数,该函数获取玩家的位置(例如 1、2、3、4 等)和空闲位置的数量(在您的示例中为 128)并返回您应该放置它的位置播放器。我用 Java 编写了这个函数,但应该很容易适应它。
/**
* @param rank
* rank of the player, best player == 1, second best player == 2
* @param partSize
* number of total free positions. Has to be a power of 2 (e.g.
* 2,4,8,16,32)
* @return returns the start position of the player, zero based
*/
public static int seedPlayer(int rank, int partSize) {
// base case, if rank == 1, return position 0
if (rank <= 1) {
return 0;
}
// if our rank is even we need to put the player into the right part
// so we add half the part size to his position
// and make a recursive call with half the rank and half the part size
if (rank % 2 == 0) {
return partSize / 2 + seedPlayer(rank / 2, partSize / 2);
}
// if the rank is uneven, we put the player in the left part
// since rank is uneven we need to add + 1 so that it stays uneven
return seedPlayer(rank / 2 + 1, partSize / 2);
}
示例:
让我们开始我们的第一场比赛(8 名种子选手,总共 8 名选手)
for (int i = 1; i <= 8; i++) {
System.out.printf("seeded player %d in position %d%n", i, seedPlayer(i, 8) + 1);
}
这打印:
seeded player 1 in position 1
seeded player 2 in position 5
seeded player 3 in position 3
seeded player 4 in position 7
seeded player 5 in position 2
seeded player 6 in position 6
seeded player 7 in position 4
seeded player 8 in position 8
导致这个领域:
[1][5][3][7][2][6][4][8] Perfect! Like expected!
进一步通知:
我不会选择超过 25% 的选手,这样锦标赛会随着时间的推移而变化,每个不太好的选手都有机会与不同的选手比赛。
关于在 128 人锦标赛中安排 32 名种子选手的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22959408/
滑动窗口限流 滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值。具体来说,滑动窗口限流算法通常包括以下几个步骤: 初始化:设置窗口
表达式求值:一个只有+,-,*,/的表达式,没有括号 一种神奇的做法:使用数组存储数字和运算符,先把优先级别高的乘法和除法计算出来,再计算加法和减法 int GetVal(string s){
【算法】前缀和 题目 先来看一道题目:(前缀和模板题) 已知一个数组A[],现在想要求出其中一些数字的和。 输入格式: 先是整数N,M,表示一共有N个数字,有M组询问 接下来有N个数,表示A[1]..
1.前序遍历 根-左-右的顺序遍历,可以使用递归 void preOrder(Node *u){ if(u==NULL)return; printf("%d ",u->val);
先看题目 物品不能分隔,必须全部取走或者留下,因此称为01背包 (只有不取和取两种状态) 看第一个样例 我们需要把4个物品装入一个容量为10的背包 我们可以简化问题,从小到大入手分析 weightva
我最近在一次采访中遇到了这个问题: 给出以下矩阵: [[ R R R R R R], [ R B B B R R], [ B R R R B B], [ R B R R R R]] 找出是否有任
我正在尝试通过 C++ 算法从我的 outlook 帐户发送一封电子邮件,该帐户已经打开并记录,但真的不知道从哪里开始(对于 outlook-c++ 集成),谷歌也没有帮我这么多。任何提示将不胜感激。
我发现自己像这样编写了一个手工制作的 while 循环: std::list foo; // In my case, map, but list is simpler auto currentPoin
我有用于检测正方形的 opencv 代码。现在我想在检测正方形后,代码运行另一个命令。 代码如下: #include "cv.h" #include "cxcore.h" #include "high
我正在尝试模拟一个 matlab 函数“imfill”来填充二进制图像(1 和 0 的二维矩阵)。 我想在矩阵中指定一个起点,并像 imfill 的 4 连接版本那样进行洪水填充。 这是否已经存在于
我正在阅读 Robert Sedgewick 的《C++ 算法》。 Basic recurrences section it was mentioned as 这种循环出现在循环输入以消除一个项目的递
我正在思考如何在我的日历中生成代表任务的数据结构(仅供我个人使用)。我有来自 DBMS 的按日期排序的任务记录,如下所示: 买牛奶(18.1.2013) 任务日期 (2013-01-15) 任务标签(
输入一个未排序的整数数组A[1..n]只有 O(d) :(d int) 计算每个元素在单次迭代中出现在列表中的次数。 map 是balanced Binary Search Tree基于确保 O(nl
我遇到了一个问题,但我仍然不知道如何解决。我想出了如何用蛮力的方式来做到这一点,但是当有成千上万的元素时它就不起作用了。 Problem: Say you are given the followin
我有一个列表列表。 L1= [[...][...][.......].......]如果我在展平列表后获取所有元素并从中提取唯一值,那么我会得到一个列表 L2。我有另一个列表 L3,它是 L2 的某个
我们得到二维矩阵数组(假设长度为 i 和宽度为 j)和整数 k我们必须找到包含这个或更大总和的最小矩形的大小F.e k=7 4 1 1 1 1 1 4 4 Anwser是2,因为4+4=8 >= 7,
我实行 3 类倒制,每周换类。顺序为早类 (m)、晚类 (n) 和下午类 (a)。我固定的订单,即它永远不会改变,即使那个星期不工作也是如此。 我创建了一个函数来获取 ISO 周数。当我给它一个日期时
假设我们有一个输入,它是一个元素列表: {a, b, c, d, e, f} 还有不同的集合,可能包含这些元素的任意组合,也可能包含不在输入列表中的其他元素: A:{e,f} B:{d,f,a} C:
我有一个子集算法,可以找到给定集合的所有子集。原始集合的问题在于它是一个不断增长的集合,如果向其中添加元素,我需要再次重新计算它的子集。 有没有一种方法可以优化子集算法,该算法可以从最后一个计算点重新
我有一个包含 100 万个符号及其预期频率的表格。 我想通过为每个符号分配一个唯一(且前缀唯一)的可变长度位串来压缩这些符号的序列,然后将它们连接在一起以表示序列。 我想分配这些位串,以使编码序列的预
我是一名优秀的程序员,十分优秀!