蓝桥杯训练——奇怪的捐赠——题解

文章讲述了地产大亨Q先生的遗愿是将100万元分成7的幂次金额,且限制条件复杂。作者尝试了错误的枚举法、暴力法(高时间复杂度),最后发现了一个基于递归和余数的最优算法来解决这个问题。
摘要由CSDN通过智能技术生成

先上题目:

地产大亨Q先生临终遗愿是:拿出100万元给X社区的居民抽奖,麻烦的是,他有个奇怪的要求:

1.100万元必须被正好分成若干份(不能有剩余)。每份必须是7的若干次方元。

比如:1元,7元,49元,343元,……

2.相同金额的份数不能超过5份。

3.在满足上述要求的情况下,分成的份数越多越好!

请你帮忙算一算,最多可以分为多少份?

一、OK,说一下我一开始的解题思路(错误),利用枚举:

1. 先将7的若干次方元排列出来,.append进一个数组tmp,然后在给所有7前面能够满足xi*i<=100w的所有情况全列出,然后sum一个各种情况下的xi的和

2.将sum搞成一个新数组

3.对于sum这个数组进行排序算法。

但是后面我和学校里边一个老师交流后,被批判说这个思路完全不是计算机思维,完全不可行。

这边因为是错误的,代码就不放了。我自己也是没跑出来结果。

因此我又想出如下办法。

二、暴力法

对于x1~x8进行八次嵌套循环,然后将满足条件的情况直接执行max()。

放代码:

value = [1,7,49,343,2401,16807,117649,823543]

sum = 1000000
res = 0

for x0 in range(6):
  for x1 in range(6):
    for x2 in range(6):
      for x3 in range(6):
        for x4 in range(6):
          for x5 in range(6):
            for x6 in range(6):
              for x7 in range(6):
                if x0*value[0]+x1*value[1]+x2*value[2]+x3*value[3]+x4*value[4]+x5*value[5]+x6*value[6]+x7*value[7] == sum:
                  res = max(res, x0+x1+x2+x3+x4+x5+x6+x7)
print(res)

基本思路:把sum和res先初始化,然后对于8个系数x进行嵌套循环,如果xi*value[i]==sum,那么就输出x0到x7的和的max值,直接输出res就ok

弊端:时间复杂度极高,在蓝桥的界面时间复杂度跑出来高达500ms!真是跑断腿。

三、最优算法(自认为)

后面与老师深♂入交流后,受到启发,写出了一种极其简单的算法。先放代码,在说思路。

num = 1000000
ans = 0

while num > 0:
  a = num % 7
  #算num的余数
  num = num //7
  #算num的整除,并且执行递归
  ans += a

print (ans)

老规矩,先初始化num和ans值,ans用于存放最终结果,num为初值。

思路:

1.先不说100w,先从10举例,如果要求10这个数怎么分呢?首先10-1,9,9不能给7整除,在一直减法,直到7,可以被整除了,然后就得到3个7**0和1个7**1,那么最优分配法就是3*7**0+1*7**1。

2.再来100,如果是100该怎么分呢?首先100-1,不行,1000-2,98,好像可被7整除了,来试试?首先余数2,是2*7**0,98呢?7*7*2,哦~那就是7**2*2,那么,最优解就是2*7**0+2*7**2,其实就是,98分解,两个49,49又是7*7,再往下就没办法分解了,因此就是2*7**0+2*7**2这个结果,也就是98被7整除,得到14,余数为0,再被7整除,得到2,余数为0,因此就是7**2*2

3.那么由此之前的举例,再回到代码,我们只需要计算出,N数的余数和N的被整除数,即可得到我们的ans,从100可一看出,其实就是先得到N的余数,然后再被7整除,得到的数,然后再被整除,得到余数,然后再被整除,一直递归,直到被除数不能在被7整除,将以上得到结果都相加,就是最终得到的答案。

以上为一算法菜鸟刚学习开始的思路和理解,请各位大神指正,如果有更好的算法,也可以评论说明,很有兴趣学习学习。

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值