猴子选大王

题目:

有n只猴子,需要选出一个大王,选择规则如下,设定一个数K,从1开始数数,数到K则淘汰一只猴子,然后继续从1开始,直到剩下最后一只猴子,求出选举过程。

  1. 分析
    最简单的思路是通过模拟的方法来得到选举过程,还有另外一种方法可以通过以下规律来得到
    假设有4只猴子编号为0 1 2 3,K为2
    0 1 2 3 第一次出去的猴子是 1 求得规则为 (K - 1) % n (n: 当前猴子的个数)
    0 2 3    再次求出队的猴子不能用上述公式求得了,原因是不连续了,其实可以形成一个映射规则,就是变为一下数据:
    0 1 2 3 第一行
    2    0 1 第二行
    对于第二行数据,现在可以继续用公式求解出队的猴子编号为1,但是并不知道这个1在最开始的时候编号为多少,虽然我们现在可以看出它的开始编号为3,但是能否形成一个统一的规律,其实就是 初始编号 = (当前出队编号 + K)% (当前人数 + 1),例如这里就是 (1 + 2)% 4 = 3
    继续出队
    0 1 2 3 第一行
    2    0 1 第二行
    0    1    第三行
    0          第四行
    第四行出来的是0,则 (0 + 2)% 2 得到 0在第三行中的位置,第三行的位置依然是0,再由 (0 + 2)% 3 得到0 在第二行中的位置,得到是2,再由 (2+ 2)% 4 得到2在第一行中的位置,得到是0,剩下的自己领会罗
#include
using namespace std;
void solve(int n, int k){
    int limit = n;
    for(int i = n; i > 0; i--){
        int  rs = (k - 1) % i;
        for(int j = i + 1; j <= n; j++){
            rs = (rs + k) % j;
        }
        cout<>n>>k;
    solve(n, k);
    return 0;
}



你可能感兴趣的:(猴子选大王)