AI机器人最高等级

AI机器人最高等级

题目描述

在小朱朱的游戏世界里,有n个AI机器人。
他们相互之间可以进行PK,胜方存活且升一级,负方直接淘汰。
高等级AI必定战胜低等级AI,同等级AI的PK结果必定一胜一负,且规定每级差距至多为1级。
一开始所有的AI机器人都是0级,小朱朱可以指定任意两个AI机器人进行PK。
小朱朱想知道,按照此规则进行AI对抗赛,能产生的最高等级AI机器人为多少级。

输入描述

一个正整数n, $ 2 <= n <= 10 ^ {18} $, 表示AI机器人的数量

输出描述

游戏结束时,最高等级AI机器人可以达到的等级

示例

输入:2;输出:1
输入:4;输出:2
输入:72;输出:8

解析

这个题目初看起来没有任何思路,那就先看看前面最高等级所需的最少情况。

首先看看什么情况下等级会最高,就用示例中的72为例:

若两两0级进行PK,则会得到36个1级AI机器人,再两两PK,则可以得到18个2级AI机器人。

若先让部分0级进行PK,再将升到1级的AI机器人和剩余的0级机器人进行PK,这里72刚好能被3整除,也就意味着第一次PK,得到24个1级AI机器人和24个0级AI机器人,第二次PK让1级AI机器人和0级AI机器人进行PK,则可以得到24个2级AI机器人。

由此可知,等级一高一低时会产生更多的同级AI机器人,也就意味着这样也会得到最高等级的AI机器人。

这样,让就从几个低等级的AI机器人所需要的最少0级AI机器人的数量是多少:

0级机器人\(n_0\):1

1级机器人\(n_1\):2

2级机器人\(n_2\)\(n_0 + n_1= 1 + 2\)

3级机器人\(n_3\)\(n_1+ n_2 = 2 + 1 + 2 = 1 + 2 * 2\)

4级机器人\(n_4\)\(n_2 + n_3 = 1 + 2 + 1 + 2 * 2 = 1 * 2 + 2 * 3\)

5级机器人\(n_5\)\(n_3 + n_4 = 1 * 3 + 2 * 5\)

6级机器人\(n_6\)\(n_4 + n_5 = 1 * 5 + 2 * 8\)

7级机器人\(n_7\)\(n_5 + n_6 = 1 * 8 + 2 * 13\)

8级机器人\(n_8\)\(n_6 + n_7 = 1 * 13 + 2 * 21\)

9级机器人\(n_9\)\(n_7 + n_8 = 1 * 21 + 2 * 34\)

..................................

由此可以看出,这里的系数满足斐波那契数列,假设斐波那契数列相邻两个数为\(a,b(a < b)\),那么,\(n_x=1 * a + 2 * b\)

由于输入最小为2,可见斐波那契数列是从0,1开始的,此时的最高等级为1。依次迭代一次斐波那契数列的系数,最高等级加1,若该系数所计算处的\(n_x\)刚好满足输入的值,则此时的最高等级为\(x\),若\(n_{x-1} < n < n_{x}\),那么此时的最高等级为\(x-1\)

据此,则可以编出下面的程序。

def ai_pk_grade(total_num):
    a, b = 0, 1
    grade = 1
    if total_num <= 1:
        return 0

    while True:
        required_num = a * 1 + b * 2
        if required_num > total_num:
            return grade - 1
        elif required_num == total_num:
            return grade
        else:
            a, b = b, a+b
            grade = grade + 1

while True:
    num = int(input())
    print(ai_pk_grade(num))

猜你喜欢

转载自www.cnblogs.com/fenghualong/p/11568259.html