【Python训练营】Python每日一练----第34天:砝码问题

184 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

题目描述1

问题描述 你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意 小于等于 NN 的正整数重量。
那么这套砝码最少需要包含多少个砝码? 注意砝码可以放在天平两边。 输入格式 输入包含一个正整数 N。 输出格式 输出一个整数代表答案。

样例输入
7
样例输出
3

样例说明 3 个砝码重量是 1、4、6可以称出 1 至 7的所有重量。 1 = 1;1=1; 2 = 6 − 4(天平一边放 6,另一边放 4); 3 = 4 − 1; 4 = 4; 5 = 6 − 1; 6 = 6; 7 = 1 + 6; 少于 3 个砝码不可能称出 1 至 7​ 的所有重量。

评测用例规模与约定 对于所有评测用例,1 ≤ N ≤ 1000000000。

运行限制
最大运行时间:1s
最大运行内存: 512M

解题思路1

砝码      重量        总重量
1          1           1
2          3           4
3          9           13
4          27          40
cnt+=1 weight*=3 total+=weight

源码分享1

#数论-最少砝码
n=int(input())#7
cnt,weight,total=1,1,1
while total<n:
    weight*=3
    total+=weight
    cnt+=1
print(cnt)#3

题目描述2

你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W_1, W_2, · · · , W_N 。 请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边。 输入格式 输入的第一行包含一个整数 NN。 第二行包含 NN 个整数:W_1, W_2, W_3, · · · , W_N 。 输出格式 输出一个整数代表答案。

样例输入
3
1 4 6
样例输出
10

解题思路2

暴力求解问题:

  • 创建三个列表l1、l2以及l3,从l1开始依次进行遍历,然后将l1中的元素和l2中的元素进行相加或者相减,将l3中没有的结果添加到l3中去
  • 一次循环结束后,此时l3中有l1和l2中的元素相减相减后的结果,此时我们将l3中存在且l2中不存在的元素添加到l2中去,因为砝码并不只是两两相加减,还可以多个进行相加减,这样在后续的遍历中,此时l1就相当于和l2中之前已经相加一次的结果再进行加减,全方位进行寻找。

源码分享2

n = int(input())
l1 = list(map(int, input().split()))
l2 = []
l2.append(l1[0])
l3 = []
l3.append(l1[0])
for i in l1[1:]:
    for q in l2:
        if i not in l3:
            l3.append(i)
        if (i + q) not in l3:
            l3.append(i + q)
        if abs(i - q) not in l3 and abs(i - q) != 0:
            l3.append(abs(i - q))
    for p in l3:  # 此时l3中含有几个砝码加和或者相减之后的结果
        if p not in l2:
            l2.append(p)
print(len(l3))

学习总结

🏅今天是我在Python训练营的第 34 天,希望每天都能见到最棒的你🏅

🌲🌲🌲 好啦,这就是今天要分享给大家的全部内容了 ❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~ 在这里插入图片描述 在这里插入图片描述