交大oj-1012-增长率问题 C++ 总结

博客总结了交大oj的一道动态规划问题——增长率问题,探讨了如何将S到T的问题转化为S到T-1的问题。博主指出增长率是百分比下的整数,并提出了三个关键点:增长率与跳跃关系,遍历思路导致的超时问题,以及解决方案。博主分享了三种不同的解决方案,包括更新计数器、使用数组或映射记录长度计数,以及预先计算最大长度后再遍历。特别强调了溢出问题和初始化的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

交大oj-1012-增长率问题 C++ 总结

明显这是一道动态规划的问题,所以我们需要思考的是怎样把S到T的问题简化为S到T-1的问题。下面是这道题需要考虑的几个问题:

1,增长率是百分比下的整数
从整数i“蹦到”整数tmp,增长率是j/100,则会有关系i*j = 100 * (tmp - i).所以i * j是100的整数倍。可以用(i*j)%100布尔表达式进判断。

2,整理思路
我原来的思路是遍历S到T的所有整数num, 检查num前面的整数哪个可以“蹦到”num,从而更新num的length和count,得到每个整数的length和count,最后可以得到T的num和count。
实际上,这种思路本身有很多问题:

  1. 计算每个num的length时,需要遍历前面的num/2的数,计算这个数能否“蹦到”num。这样的话,当num接近题目给的T最大值(200000)时,每个num都需要遍历大量的数,明显会超时。
  2. 最后一个数T对应的count并不是题目要求的count。从S到T的增长序列并不一定从S开始,到T结束,所以长度为maxlength的序列并不一定以T结束。解决方法:
    1. sol1:定义一个long long int值cnt,当长度更新时则更新cnt,当遇到长度等于maxlength的序列时,更新cnt。最后得到的cnt就是结果。
    2. sol2:还有来自网上的一个解法。定义一个数组或者是map,记录下每个长度对应的count,最后输出map[maxlength]即可。
    3. sol3:先计算maxlength,最后遍历数字,统计长度为maxlength的序列的count,求和。
  3. 注意溢出问题!!(这点让我头疼很久。。。)记录times的数组尽量用long long int型!
  4. 以2.1为例:定义和初始化时,注意初始化的值!
maxlength = T - S + 1;
long long int times_maxlen = end - start + 1;
// 不这样写可能会有错误。
// Eg:996 998
// 默认认为理想情况:times_maxlen = 1, 此时的 maxlength = T - s + 1.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值