- Even Digits
- Lucky Dip
- Scrambled Words
Even Digits
给一个数,找离他最近的不包含奇数位的数。
思路:从左到右找第一个奇数,首先判断是要找比他大的数还是比他小的数(+1还是-1)。这取决于后面的数以及这位数的情况。
如果这位数位9,一定是找比他小的,因为+1将会造成进位,高位为了保持偶数需要进两位,肯定比-1要大。
如果后面的数小于4444……(字典序比较一下),则找比他小的,奇数位-1,后面改成8888……
如果后面的数大于4444……,则找比他大的,奇数位+1(不是9,不会进位),后面改成0000……
最后相减获得答案
C++ Code
1 | #include <iostream> |
Lucky Dip
给定一堆数,问给定放回机会数的情况下采取最优策略抽取的数的期望是多少。
最优策略是若当前抽出的数小于当前的期望,有机会放回则放回重抽。所以每多一次机会的情况就是小于当前期望的所有数的期望变成当前的期望,然后计算新的期望。
1 |
|
Scrambled Words
给定一段文本的生成规则,生成文本后,给定一个字典,问有多少个字典中的词的乱序(除了首位字母之外,其他字母可以随意排列)在文本中出现。
由于字典中词不同的长度种类不会太多,题目中说总长度为1e5,那么长度数X*(X+1) <= 1e5
所以统计不同的长度,使用字符串的首尾字符以及字符的频数来作为一个字符串的key建立hash表。
C++ Code
1 |
|