1. Even Digits
Q:给一个数,每次可以加一或减一,求最少操作次数,使得最后这个数的十进制表示中每个位都是偶数。
数据范围:
(1≤T≤10^5),
(1≤N≤10^{16})
Sample:
Input
4
42
11
1
2018
Output
Case #1: 0
Case #2: 3
Case #3: 1
Case #4: 2
A:
小数据集直接往上或往下加减i,碰到就行;
大数据集可以按照以下方法:
但遇到9比较难处理。遇到9需要进位,但要保证左边,需要进2.如果遇到左边是8,可以一直往上变成0.
2. Lucky Dip
Q:有一个长为n的数组,从中随机抽取一个数出来,有K次机会放回重抽,求采取最佳策略下取出来的数的期望。
Limits
Memory limit: 1GB.
(1 ≤ T ≤ 100).
(1 ≤ V_i ≤ 10e9).
(1 ≤ N ≤ 2 * 10e4).
Small dataset (Test set 1 - Visible)
Time limit: 20 seconds.
0 ≤ K ≤ 1.
Large dataset (Test set 2 - Hidden)
Time limit: 60 seconds.
0 ≤ K ≤ 5 * 10e4.
A:
这个解决方案将同时传递小数据集和大数据集。
期望值落在范围[s, l],其中s是数组中最小的值,l是数组中最大的值。我们希望找到我们可能得到的最大的期望值,如果我们允许k返回。
设E[k]表示可返回k次的最优期望值,则
如果k = 0,我们知道期望值是这个整数数组的均值。
如果k = 1,我们可以返回我们选择的值得到期望值E[0],或者我们对集合A[i]中大于E[0]的值求和,对于小于等于E[0]的值我们对E[0]进行多次求和。
总体来说,如果你能丢掉N次,最佳的策略是:
- 如果你得到的值>=E[k-1],你就保留它;
- 如果不是,就丢掉它
例如,给定A = {4,3,2,1}, E[0] = (4 + 3 + 2 +1)/4 = 2.5,
E[1] =(4 + 3 + 2.5 + 2.5)/4 = 3,这里可以看到2和1都小于2.5
这很容易推广到k = k的情况
对于k = 2,我们有
E[2] = (4 + 3 + 3 + 3)/4 = 3.25
它给出了下面的递归式,
E[0] = SUM(A[i]) / N;
E[k] = SUM(max(A[i], E[k-1])) for k > 0
可以考虑,先排序,然后用二分查找需要保留和丢弃的临界点,这样时间复杂度为(O(NlogN+KlogK))
3. Scrambled Words
Q:给长为一个n的字符串,还有L个字符串,求这L个字符串中有多少个字符串的的变形体在长字符串中。一个字符串的变形是除了头尾两个字符不可改变之外,其他字符可以任意重排。
Limits:
1 ≤ T ≤ 20.
No two words in the dictionary are the same.
Each word in the dictionary is between 2 and 105 letters long, inclusive.
The sum of lengths of all words in the dictionary does not exceed 105.
S1 and S2 are lowercase English letters.
0 ≤ A ≤ 1e9.
0 ≤ B ≤ 1e9.
0 ≤ C ≤ 1e9.
1 ≤ D ≤ 1e9.
Small dataset
1 ≤ L ≤ 1000.
2 ≤ N ≤ 1000.
Large dataset
1 ≤ L ≤ 20000.
2 ≤ N ≤ 1e6
A:
- 自己的想法:设置一个map,map的key是初始字符,value是个ArrayList,ArrayList里面存三位数组,分别是结束字符,长度和hashcode。
- 判断两个word相等:先判断首字母和尾字母是否相等,再看内部频率;
- 维护频率数组,进行hash优化