【算法专题】算法设计与分析习题(一)
YY and Lucky Number
★ 题目信息
题目描述:
YY 的幸运数字是…,是什么数字我也不知道,但是已知这个数字的十进制表示(不含前导零)中只包含不超过两个不同的数字。
给定一个数 n ,请计算出不超过 n 的所有正整数中,有可能是 YY 的幸运数字的个数。
输入:
输入一行,包含一个正整数 n。
对于 60% 的数据:
对于 100% 的数据:
输出:
输出一个整数,表示不超过 nn 的所有正整数中,有可能是 YY 的幸运数字的个数。
输入样例:
1 | 103 |
输出样例:
1 | 101 |
样例解释:
不超过103的所有正整数中,只有102、103不可能是 YY 的幸运数字。
★ 题解
这题的解法五花八门,数位dp、二分的都有,比较了各方答案之后,感觉这个最好理解了…(实际是自己做不出来,想了两天,思路都太复杂)
- 对于一个数字而言,各个位置上的数字不能有超过两个不同,因此在使用dfs进行逐位遍历并循环可能取值的时候,需要有pre和post保存之前使用过的数字。
- 当i值和pre或者post重复时,显然当前这个值是可以被选作幸运数字的,那么就继续之后的dfs过程。
- 如果i值和pre、post都不重复,又可以分成两种情况。其中一个是post为-1时,表明前面只用了一个数,那么接下来的dfs中post将赋值为i,表明它是可用的。第二种情况是i与pre、post均不相同,那可以进行剪枝操作,就是整个都废了。
- 最后需要注意的是,我们处理的数是不能大于n的,所以
(n - i) / cur < 10
判断也非常重要。
1 |
|
YY and One
★ 题目信息
题目描述:
YY 很享受一个人独处的时光。
这可能也是 YY 对 1 这个数字情有独钟的原因。
现在,对于给定的一个正整数 n,YY 想把它表示为若干个加数之和,其中每个加数都是仅包含 1 的整数。YY 想知道这些加数最少可以包含多少个 1 。
例如:对于正整数 10,可以表示为:10=11+(−1)10=11+(−1) ,包含 3 个 1 。
输入:
输入一行,包含一个正整数 n。
对于 60% 的数据:
对于 100% 的数据:
输出:
输出一个整数,表示所有加数包含 1 的个数的最小值。
输入样例:
1 | 1232 |
输出样例:
1 | 10 |
样例解释:
最优解为:1232=1111+111+11+(−1) ,包含 10 个 1 。
★ 题目信息
- 对于整数n,先找到第一个比它大且全为1的数,和第一个比它小且全为1的数。比如对于123来说,第一个比他大并且全为1的数是1111,第一个比它小并且全为1的数是111。
- 比较它们和n之间的差值,对较小的那个进行递归处理,处理差值即可。比如,123离111更近,实际问题就转化成了,(123-111)之间还需要多少个1才能完成计算。也就是说,count(123)表示的是实现123要几个1,现在的问题就变成了,count(111) + count(12) = 3 + count(12)
1 |
|
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.