2013-05-20 Robert Zhang
分析:设有n个整数a1,a2,...,an,已知两两整数的和,则: (a1 + a2) + ... + (a1 + an) + (a2 + a3) + ... + (a2 + an) + ... + (an-1 + an) = (n - 1)S 继续阅读 »
2013-05-19 Robert Zhang
分析:比较简单的方案是:依次用1,11,111,1111,……来尝试,直到某个数与输入的余数为0为止。当然,111……1可能非常大(实际上可达数千位之巨,比如8141对应的111……1有3486位),为此我们要使用自制的“大数”来运算。据此有方案一:more 继续阅读 »
2013-05-09 Robert Zhang
more ```cpp include include include include using namespace std; 继续阅读 »
2013-05-09 Robert Zhang
分析:如果每次都让最快的人陪别人过桥,然后他再返回陪另一个人过桥,这是最佳方案吗?以sample输入为例:有4个人,过桥时间分别是:1 2 5 10。按前述策略的过桥方案为: 1 10 1 1 5 1 1 2 共19秒。但按照sample的过桥策略只要17秒:more 继续阅读 »
2013-05-08 Robert Zhang
分析:把一堆煎饼按自底向上的顺序插入到数组中(这样饼号就等于元素下标号加一),然后从数组第一个元素开始向后遍历,每次把最大的煎饼放在遍历的当前位置。more ```cpp include include include include include 继续阅读 »
2013-05-07 Robert Zhang
分析:该题等价于“寻找一个正整数A,使得在一个给定的正整数数列中的每一个数与A的差的绝对值之和最小”。显然A应当不小于该数列的最小值,不大于该数列的最大值。乍看上去,似乎平均数是一个比较合理的解,但考虑一个例子“1 30000 30000”,其平均数约20000,此时的和约为40000,但如果A取30000,其和约为30000,显然取平均数是错误的。经过一番尝试,似乎中位数是一个更合理的解。more但如何证明?这到颇费思量,可参考 继续阅读 »
2013-05-05 Robert Zhang
分析:如果把词典中的单词当作顶点,把doublet看作连接两个顶点的边,那么这个问题实际上是在一个无向图中搜索两个顶点间的最短路径,如果有的话。“最短路径”可能使人联想到复杂的Dijkstra或者更复杂的Floyd-Warshall算法,但在本题中,由于图的边没有权值,因此可以简单地使用以s为起点的广度优先搜索来找出到达点t的最短路径,如果有的话。 继续阅读 »
2013-05-05 Robert Zhang
分析:注意到“the quick brown fox jumps over the lazy dog”包含了全部26个英文字母,所以只要找到一句相匹配的密文,就可以解密全部了。more ```cpp include include include include include 继续阅读 »
2013-05-03 Robert Zhang
more ```cpp include include include include using namespace std; const char * values[] = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"}; const char * suits[] = {"Clubs", "Diamonds", "Hearts", "Spades"}; 继续阅读 »
2013-05-01 Robert Zhang
分析:使用回溯法求解。为了提高搜索效率,在选择“分支”时应该挑选“分支因子”较小的子树优先搜索,下面的order函数即为此目的而设。它根据单词所含字母在全句中出现的频度以及单词的长度给单词打分,然后根据分值对单词进行排序(升序),排在最后的单词会被首先破译,接下来是排在倒数第二的单词,依次进行。如果不使用order函数对加密后的单词进行排序就直接尝试破译也是可以的,不影响程序的正确性,只是会降低时间效率(虽然在本题中,仍不会超时)。more 继续阅读 »