给定一个硬币n(< = 10 ^ 9),我可以换成3个硬币:n / 2,n / 3和n / 4(其中INSERT INTO HR.tweets (DATE_TIME,USER_NAME,TWEET_BEFORE,TWEET_AFTER)VALUES ((select SYSDATE from dual),'Dannazxcv','RT @HugotInhinyero: Wish we could turn back time to the good old days. When our mama sings us to sleep but now we're stressed out.
#engin…','hugotinhinyero turn back time good days. mama sing sleep we're stress out. engin' )
代表地板分割)。我能赚的最多金额是多少?我的代码是:
/
如何改善时间和空间复杂度? 问题:https://www.hackerearth.com/problem/algorithm/bytelandian-gold-coins/description/
答案 0 :(得分:0)
一些想法,还没有明确答案。
首先,你的方法非常合理。您的数字最多为10 ^ 9,您无法预处理所有数字。相反,你会考虑到这个过程更频繁地选择较小数字“某种方式”,所以你只记忆到某个上限,这里是10 ^ 7.
您的基本算法的一个简单改进就是意识到您只需要记住2
或3
的倍数。所有其他输入都可以轻松地与count
函数中的这些数字相关联。
另一个优化可能是根据经验改变上限10 ^ 7。也就是说,选择一些介于10 ^ 5和10 ^ 8之间的值,然后用最短的执行时间输入一个。
改进这种基本方法并非易事,但改进方法的方法是深入了解数字选择程序。基本上,人们应该记住那些经常被选中的数字,并留下那些只被挑选几次的数字。
这里可以做很多事情,但通常必须在你提交给比赛的程序中即时生成记忆程序所依据的必要结果。我想这很难提出有竞争力的解决方案。我可以想象"memoize all below 10.000"
,"memoize multiples of 5 above 10.000"
,"memoize multiples of 7 above 10.000"
等形式的简单规则可能会有用。这些规则可以很容易地编码到程序中,而不需要太多的内存。例如,可以通过遗传算法预先找到它们。
对于精确的方法,可以假设问题中硬币数量的均匀分布。然后,可以循环遍历所有数字i
,最多10 ^ 9,并查询过程选择每个数字k<i
的频率。结果是数组count[i]
。接下来,为L
选择下边距count[i]
并记住i
所有数字count[i]>=L
。但是,如上所述,这个程序太昂贵了,因为它必须在运行中完成。
你可以做的只是选择N
最常被选中的数字,并在代码中对它们进行硬编码。所包含的记忆号码的实际数量N
可以通过任务中的记忆约束来确定。