Agony


私信TA

用户名:uq_85692186402

访问量:593

签 名:

i am because u are

等  级
排  名 20096
经  验 702
参赛次数 0
文章发表 3
年  龄 16
在职情况 学生
学  校 东莞理工学院
专  业 计算机科学与技术

  自我简介:

慢慢发掘

TA的其他文章

解题思路:我们枚举出前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 人评分

  评论区

如果还是看不懂,就这样
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])
   print(r)

res = 0  # 统计数目 符合的数
di = {}  # 建立一个字典,以分层不同的倍率层
for j in r:
   di[j] = di.get(j, 0) + 1  # 不断增加个数
   res = max(di[j], res) #符合数目最多的那个
   print(di,res)

print(len(a) - res)  # 减去倍率层中数目最多的那个 就是最小要修改的数
 
在编译器上自己输入数据多测试几次,慢慢地看这个输出的结果,感悟一下
 
2024-02-14 21:04:41
  • «
  • 1
  • »