2012年3月26日

USACO习题:Dual Palindromes

摘要: 和之前一道回文题目差不多,解法还是使用前文的方法。核心方法参考如下:View Code bool is_palindrome(int num,int base){ int reversed = 0,temp=num; while(temp!=0){ reversed = reversed*base + temp%base; temp/=base; } return (reversed==num);}题目完整代码:View Code #include <iostream>#include <fstream>#include <string>#i... 阅读全文

posted @ 2012-03-26 11:39 lzyzizi 阅读(165) 评论(0) 推荐(0) 编辑

USACO习题:Palindromic Squares

摘要: 这道题的核心是考回文数字的判断。判断回文的手法基本可以分两类。1.转换成字符串来判断,也是参考答案里的做法。(思路比较简单,这里不在熬述)2.数学方式来判断(只能判断数字),使用mod的方法。这个方法的好处是,不要把数字转换成相应进制的表达方式然后再判断。手法比较巧妙。下面我来讲解下方法2.首先我们从最简单的十进制讲起,比如有个数 123。十进制的表示: 1*10^2 + 2*10 + 3如何把这个数颠倒?0*10 + 123 % 10 = 3 然后 123/10=123*10 + 12%10 = 32 然后 12/10 = 132*10 + 1%10 = 321看出什么规律来了么?我们再来看 阅读全文

posted @ 2012-03-26 11:37 lzyzizi 阅读(261) 评论(0) 推荐(0) 编辑

USACO习题:Name That Number

摘要: 这道题或许是这个SEC里最有难度的题目了。题目有些误导,让你用数字先生成所有可能的字母,然后再去字典里找。这种做法的复杂度随着数字的长度n的上升而上升,为O(3^n)是非常可怕的,而且生成不同长度的字母,需要根据数字长度决定循环的数量,这里就会用到递归,使得代码变得异常复杂。静下来仔细想想,每组数字可以对应多个单词,同样的,每个单词回应一个数字。换句话说,我们可以轻松得为字典中每个单词先生成一遍数字,然后根据数字去反查单词。这样代码的速度就非常快了,而且一旦生成好对应,以后任何数字的匹配时间基本等于一次哈希的时间即O(1)。注:在单词转数字的时候,使用一些数学的小技巧可以有效地节省不少代码(对 阅读全文

posted @ 2012-03-26 11:13 lzyzizi 阅读(182) 评论(0) 推荐(0) 编辑

USACO习题:Transformations

摘要: 第一次题目没看清,以为是给定一个矩形,求最小的变换路线,我想SEC1和2原来差距如此之大啊。。。后来仔细一看,只要变一次,这个题目就编程弱智题了。我比较懒,没有一个一个旋转去写,而是实现了1个顺时针九十度和一个镜像。顺时针90度,数组下标变换策略:目标矩阵(j,N-i-1) <-- 原矩阵(i,j) ,其中N为矩阵的宽度垂直镜像:目标矩阵(i,j) <-- 原矩阵(i,N-j-1) ,其中N为矩阵的宽度知道这些代码就非常好写View Code 1 #include <iostream> 2 #include <fstream> 3 #include < 阅读全文

posted @ 2012-03-26 11:06 lzyzizi 阅读(244) 评论(0) 推荐(0) 编辑

导航