解题思路:我们枚举出前30个数的时候,发现第31个数已经超出了10的6次方,那么这后面的数全部都要修改,所以我们就不管30个以后的数了,我们的关注点就放在这30个。 然后我们发现,以下的式子都符合斐波那契数列的定义:
互相为倍数关系 1:1 1 2 3 5
2:2 2 4 6 10 3:3 3 6 9 15 则可以设计字典录入每层中有多少数,进行动态解题 循环每到一个数则对数取余看是否满足倍数关系,在对数取整存入 字典,最后利用数组长度减去倍数层最多的数,可得到需要修改的数。
注意事项: get函数的使用 --- 用在字典处
dict.get(key, default=None)
解释:
key:字典中要查找的键
default:键不存在时要返回的默认值,若不提供,则返回None
参考代码:
n = int(input()) # 接收数组长度
a = list(map(int, input().split())) # 输入的要修改的数组
nums = [1, 1]
for i in range(1, 29):
nums.append(nums[i - 1] + nums[i]) # 枚举出前30个斐波那契数列
r = [] # 接收nums / a 的倍率
for i in range(min(len(a), len(nums))):
r.append(nums[i] / a[i])
res = 0 # 统计数目 符合的数
di = {} # 建立一个字典,以分层不同的倍率层
for j in r:
di[j] = di.get(j, 0) + 1 # 不断增加个数
res = max(di[j], res) #符合数目最多的那个
print(len(a) - res) # 减去倍率层中数目最多的那个 就是最小要修改的数
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复