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) 编辑

2012年3月21日

USACO习题:Milking Cows

摘要: 这道题目,给你一组时间范围,求最大的时间跨度和最大的时间段间隔。题目看似挺简单,但是如果不加考虑却会发现其中对于时间间隔的处理,有多种情况。也就是会所程序里可能会出现出多的判断语句,使得代码变得非常难写而且容易出错。我的第一版解法我采用了一种比较奇怪的数据结构,就是将链表和线性表结合。线性表用于表示一条时间轴,链表用于表示不同时间的跨度。以样例数据为例300 1000700 12001500 2100我先不论时间的起点和终点,将他们一并放在一个数轴上,然后排序,得到一个时间轴。300 700 1000 1200 1500 2100这是第一步处理,我的第二... 阅读全文

posted @ 2012-03-21 11:41 lzyzizi 阅读(203) 评论(0) 推荐(0) 编辑

2012年3月19日

USACO习题:Broken Necklace

摘要: 这道题要求我们求一个字符串,符合某个条件的最长子串的条件。按照题目要求,我们的目的就是找到合适的分割点,使得两边的字符串的和最长。例如:rbrrrbbbrb,我们看到从中间分割的话,我们得到rrrbbb的子串,显然他是最长的。从题意看,从任意一种相同颜色间隔来分割一定不会是最合算的。比如brrrb,我们这样分割,brr rb,我们得到的子串是rrr,而从rrr两边的任意一边分割,我们得到的长度都是rrr + x > rrr。显然,分割点一定是在颜色交错的地方最合算。但是题目让人讨厌的地方有两点:1.项链中有w元素,他既可以作为r也可以作为b。2.项链是一个环,最长子串可能发生在数组尾部和 阅读全文

posted @ 2012-03-19 13:49 lzyzizi 阅读(212) 评论(0) 推荐(0) 编辑

2012年3月18日

USACO习题:Friday the Thirteenth

摘要: 这道题难度不大,就是比较麻烦。求解所有月份13号是星期几。#include <iostream>#include <fstream>#include <string>#include <vector>using namespace std;const int MONTHS[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};vector<int> ACC_MONTHS(13,0);vector<int> ACC_LEAP_MONTHS(13,0); bool is_leap_year(i 阅读全文

posted @ 2012-03-18 21:38 lzyzizi 阅读(136) 评论(0) 推荐(0) 编辑

USACO习题:Greedy Gift Givers

摘要: 几个朋友给钱的问题。建立一个数组保存每个人的钱,收的加,出的减即可。#include <iostream>#include <fstream>#include <string>#include <map>#include <vector>using namespace std;int main() { ofstream fout("gift1.out"); ifstream fin("gift1.in"); int np = 0; fin>>np; //get the number 阅读全文

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

USACO习题:Your Ride Is Here

摘要: 开题记:公司内部要做OI,同事拜托我去USACO上做题。我平时做题主要是在Project Euler上,USACO还是第一次听说,上去看看觉得还不错。因为考虑到要在内部开展,平时那么随意做做的话以后要讲起来不太方便,所以决定把解题思路记在这里。同时锻炼下我糟糕的C++。题目很长,废话奇多无比。其实说白了,就是给两个单词,比较两个单词转换的数字是否对于47同余。转换规则如下:A表示1,B表示2。。。Z表示26,给定一个单词,比如USACO,他的值为21 * 19 * 1 * 3 * 15 = 17955。17955 mod 47 = 1。如果两个单词mod 47的余数相等,我们就输出GO,反之S 阅读全文

posted @ 2012-03-18 15:26 lzyzizi 阅读(333) 评论(0) 推荐(0) 编辑

导航