Battle of the Brains
TC-srm302(exercise)
250.DivisorInc
给你两个数a和b,a可以加上自己的因子(除了1和本身),问最少操作几次a可以变成b
int countOperations(int N, int M)
直接暴力bfs就好了,枚举因子的时候注意枚举到sqrt(N),判断整除,然后加上i或者N/i
膜拜了教主的代码,发现太犀利了,直接从N开始两个for循环解决,根本不用什么bfs,难怪以247分拿下,YM
500.IntegerPalindrome
询问从1开始第K大的回文数
long long findByIndex(int K)
可以发现每个回文数其实都是由他的一半部分构造成的,所以倒过来想,123可以变成12321和123321,所以有一下结论:
从小到大的回文数的(括号里是生成它的自然数) 1(1),2(2)...8(8),9(9) 11(1),22(2)...88,(8)99(9) 101(10),111(11)...989(98),999(99) 1001(10),1111(11)...9889(98),9999(99) 10001(100)......
也就是每个自然数可以变成两个回文数,并且是以9,90,900…为一组的,于是我们就可以早到第k大的回文数所在的组数并把它计算出来
900.JoinedString
经典题目:给你N(<=12)个串,求在AaBcd+aBcdE = AaBcdE的规则他们的总和最小是多少
string joinWords(vector <string> words)
状态压缩dp,dp[1<<n][n],表示已经加上的串的状态数和最后一个串
为了避免重叠,可以开始把words处理一下,如果一个串是别人的边界子串的话就可以不必考虑(这个结论显而易见)
还有为了避免超时,串之间两两合并的位子可以先预处理出来
然后记忆化搜索完美解决这问题
Popularity: 8% [?]
| 打印文章 | 这篇文章由shǎ崽于2010/01/25 20:42发表在Solution。你可以订阅RSS 2.0 也可以发表评论或引用到你的网站。 |