求助一道算法题

2019-02-26 17:53:23 +08:00
 captcha
输入:
武器初始强度 S
可用强化点数 P

强化规则:
每次可使用 q 个强化点数,使武器强度升为 S * (1 + q / 100),小数部分舍去
直至强化点数用完

范围:
S, P, q 均为正整数
S <= 10^10
P <= 1000

求强度最高可以升到多少
1507 次点击
所在节点    问与答
10 条回复
captcha
2019-02-26 18:04:22 +08:00
算了一下 S 超过 10000 的话,好像每次使用 1 点是提升最快的。5000 以下则不确定,例如 4950、167 等很多。

4950 * 1.01 = 4999.5 ----> 4999
4999 * 1.01 = 5048.99 ---> 5048

4950 * 1.02 = 5049,一次用 2 点结果更大

感觉低位只能比较暴力地遍历,不知道有没有好的方法。
greyqz
2019-02-26 18:09:03 +08:00
目测可以用动态规划解。
ballshapesdsd
2019-02-26 18:13:57 +08:00
难道不是每次用一个强化点数直到用完吗
maggch
2019-02-26 18:15:28 +08:00
n 方 dp
salinapper
2019-02-26 18:16:51 +08:00
@ballshapesdsd #3

因为有取整这个操作,所以不是..

如果初始是 1,必须一次用 100 点才能变成 2,否则一直是 1。
1 楼也有反例
chairuosen
2019-02-26 18:17:56 +08:00
@captcha 你在逗我。。。不管 n 是多大。n*1.01*1.01 和 n*1.02 哪个大?
ballshapesdsd
2019-02-26 18:22:56 +08:00
@salinapper #5 审题不细致
captcha
2019-02-26 18:34:55 +08:00
@chairuosen
没有逗你,表达式应该是 Math.floor(Math.floor( n * 1.01) * 1.01) 和 Math.floor(n * 1.02)
aijam
2019-02-26 19:41:15 +08:00
@captcha q 是固定的值吧?如果 P 不能被 q 整除,剩余的点数怎么处理?
yzwduck
2019-02-26 20:06:40 +08:00
这数据范围就暗示着用动态规划欸。
记 M[x] 表示累计使用 x 个强化点数后的最大武器强度,
M[0] = S;
M[x] = upgrade(M[x-i], i), i=0..x。
然后 x 从 0 到 P。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/538973

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX