13届蓝桥杯决赛Python C组 斐波那契数组

文章讲述了如何通过比较给定数列与a0=1的斐波那契数列的比值,判断并优化超出1e6范围的斐波那契数列元素。作者提供了Python代码实现,利用排序和计数的方法确定元素是否需要修改。
摘要由CSDN通过智能技术生成

题目描述

求解思路 

求解该问题需要注意两点。

  1. 题目所给ai的取值范围为ai\epsilon [1,1e6],然而对于a0 = 1的斐波那契数列,其第31项的大小已经超过了1e6,这意味着再该数列中的第31及以后项都需要修改。
  2. 题目仅给出了a0 = a1,因此a0 的取值不一定为1。

我们分别打出a0 = 1和a0 = 2的斐波那契数列的前30项。

fib = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657,
       46368, 75025, 121393, 196418, 317811, 514229, 832040]
fib1 = [2, 2, 4, 6, 10, 16, 26, 42, 68, 110, 178, 288, 466, 754, 1220, 1974, 3194, 5168, 8362, 13530, 21892, 35422,
        57314, 92736, 150050, 242786, 392836, 635622, 1028458, 1664080]
for i in range(30):
    print(f'比值{fib[i]/fib1[i]}')

可见两数列的对应位置元素比值都是一定的。

因此我们可以通过使用比值的性质,将题目所给的数列的元素与a0 = 1的斐波那契数列元素相除 ,通过判断相除的结果是否相同,判断出元素是否需要修改。

代码实现

def ques_e():
    f = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657,
         46368, 75025, 121393, 196418, 317811, 514229, 832040]
    n = int(input())
    inp = list(map(int, input().split()))
    ans = max(0, n - 30)
    tim = []
    for i in range(min(n, 30)):
        tim.append(inp[i] / f[i])
    x = 0
    tim.sort()
    for i in tim:
        cnt = 0
        for j in tim:
            if i - j == 0:
                cnt += 1
        x = max(x, cnt)
    ans += min(n, 30) - x
    print(ans)


    # fib = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657,
    #        46368, 75025, 121393, 196418, 317811, 514229, 832040]
    # fib1 = [2, 2, 4, 6, 10, 16, 26, 42, 68, 110, 178, 288, 466, 754, 1220, 1974, 3194, 5168, 8362, 13530, 21892, 35422,
    #         57314, 92736, 150050, 242786, 392836, 635622, 1028458, 1664080]
    # for i in range(30):
    #     print(f'比值{fib[i]/fib1[i]}')
    # 


ques_e()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值