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