GLORY | 学习·记录

coding for life

2010-7-16
--------------------
在设计算法的时候,拿出一张纸自己列出来思路,并且实现算法。如果只是一味的空想容易作无用功,很久想不明白的东西画个图列表就可能清楚了。实现完成之后,我之前的习惯是过了Sample立马Submit,完全就是撞运气。这个时候应该继续在纸上跑一遍自己的程序,看是否每个边界条件都按照预期达到了,程序是不是走了之前预想的路径。

posted @ 2010-07-16 23:07 meglory 阅读(159) | 评论 (0)编辑 收藏
uva 490 转动字符串:Linux下面的Ctrl-D和Windows下面的Ctrl-Z一样可以模拟EOF.
posted @ 2010-07-16 23:01 meglory 阅读(169) | 评论 (0)编辑 收藏
在chinaunix上面看到的一段话。
原文在这里

假如你还没有读过本文,请尽量抽出一些时间仔细地读一读它。
1,请在你有空的时候,多去读一读置顶的精华目录里边的帖子,哪怕是你现在还没有碰到什么麻烦,也请尽量去读一读它。精华通常是以前讨论过的一些比较精彩的帖子,也许会对你的学习有所帮助。

2,平时有空了,多来几次这个论坛,碰到别人讨论某个自己比较熟悉的问题的时候,请尽量参与发言。通常情况,你自己认为是对的东西说出来以后都会有人反驳,在辩论的过程中你会发现自己对相关知识的认识会更进一层。

3,假如你碰到什么麻烦了,请尽量回忆一下,精华中是否有相应的内容?如果没有,再去发帖子。当然了,如果第一步你做的比较好的话,你基本上都会很快做出判断的。

4,置顶的帖子中有一些书籍,都是大家公认为比较出色的,如果你还有业余时间,请下载下来抽空阅读一下,对提高你的水平大有裨益。

5,当你通过论坛解决了自己的问题之后,不妨把解决的方法写出来,告诉大家。这样会很方便后来的人。

posted @ 2010-07-16 13:06 meglory 阅读(153) | 评论 (0)编辑 收藏
除法

输入正整数n,按从小到大的顺序输出所有形如 abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2<=n<=79。
样例输入:
62
样例输出:
79546/01283=62
94736/01528=62

如何解决这个问题?

2010-7-16更新
上面的问题让我一下子想到了如何求一个序列的全排列的问题,于是顺着这个思路摸索了一下。Google到了一个算法。

递归
例说明如何编写全排列的递归算法。
1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。由于一个数的全排列就是其本身,从而得到以上结果。
2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。
即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的组合和以5开头的和3,4的全排列的组合.
从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。
因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。
为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。
posted @ 2010-07-15 22:02 meglory 阅读(533) | 评论 (0)编辑 收藏
根据先序和中序确定后序的题目,非常经典的数据结构题目。

假如有一棵树的先序遍历是
DBACEGF,后序遍历是ABCDEFG。
因为先序遍历是根节点-左子树-右子树,所以可以确定D是这颗树的根节点。
考虑中序遍历是左子树-根节点-右子树,所以中序的序列被根节点分成了两个部分,在这里就是ABC和EFG,分别是左子树和右子树。
接下来可以确定的以D为根节点的数的左子树的先序遍历为BAC(节点个数根据中序的左子树节点个数确定),右子树的先序遍历为EGF.
这样,我们的问题就转化成为了与源问题相同的两个子问题,那么就可以通过递归来实现,结束的条件就是子树只剩一个节点,这个时候先序和中序是一样的,打印出来,然后return到上一级。
综上,解决办法就是现找到根节点,然后根据中序列划分成两个部分,然后分别递归解决。
需要注意的是,可能出现这样的状况:先序为AB,中序为BA;或者先序为AB,中序为AB的情况。即划分子树的时候可能右子树或者左子树为空
所以需要加一个判断,就是是否用来指示序列的左指针已经大于右指针。

POJ 3094  Quicksum实在太水,提一声就ok。
posted @ 2010-07-14 23:44 meglory 阅读(152) | 评论 (0)编辑 收藏
我实现了一个原生的版本,后来在Wikipedia看到欧拉的优化版本,但是不大知道如何实现。
原来的版本是直接判断是否是素数,所以空间占的比较少,时间比较多。打表法以后,应该是空间换时间的办法,但是为啥时间和空间都变大了呢?
应该是我实现的有问题,今天思考一下。


7152474 meGLORY 3006 Accepted 4056K 641MS C 551B 2010-07-14 11:35:03
7150446 meGLORY 3006 Accepted 156K 250MS C 405B 2010-07-14 00:15:01

大概思考了一下,加了几个判断语句,时间成功的降到了100多一点了,内存还是4056K.
meGLORY 3006 Accepted 4056K 125MS

posted @ 2010-07-14 13:22 meglory 阅读(120) | 评论 (0)编辑 收藏
这两天都是水题,没有什么想法而言,就是为了熟悉一下感觉。我又给互联网上增加了不少垃圾日志。
昨晚出了点突发事件,原定的写程序事件被用来处理事情了。不过后来我倒是有点想明白了,题目只是很少一点时间在看题目,很忙的时候可以先花几分钟把题目弄明白了,然后在去忙别的事情,这种件的空隙还能想一想思路。不知POJ有什么办法可以把题目批量导出的,我就不用天天费劲上网读题目了,在单位也能抽空瞅两眼。

我坚持两件事情:1。决不直接贴
题目代码  2。每天都写题目

POJ 3006
计划打个表,然后直接搞,看了一下数据很小,应该没有什么问题。

在这里顺便题一下素数筛选法。
以下内容来自Wikipedia:

To find all the prime numbers less than or equal to a given integer n by Eratosthenes' method:

  1. Create a list of consecutive integers from two to n: (2, 3, 4, ..., n).
  2. Initially, let p equal 2, the first prime number.
  3. Strike from the list all multiples of p less than or equal to n. (2p, 3p, 4p, etc.)
  4. Find the first number remaining on the list after p (this number is the next prime); replace p with this number.
  5. Repeat steps 3 and 4 until p2 is greater than n.
  6. All the remaining numbers in the list are prime
后来,欧拉同学提出了另外一个办法,让每个数只要标记一次就ok

A) Start with all the natural numbers except '1' which is not a prime:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ...
^

B) The leftmost number is prime. Multiply each number in the list by this prime and
then discard the products:

(4 6 8 10 12 14 16 18 20 22 24 26 28 30 ... )

These are removed:
4 6 8 10 12 14 16 18 20 22 24 26 28 30

These are left:
2 3 5 7 9 11 13 15 17 19 21 23 25 27 29 ...
^

C) The number after the previous prime is also a prime. Multiply by it each number
in the new list starting from this prime and then discard the products:

(9 15 21 27 33 39 45 51 57 63 69 75 81 87 ...)

These are removed:
9 15 21 27

These are left:
2 3 5 7 11 13 17 19 23 25 29 ...
^





=================================================
2010-7-13 23:47
拆掉了自己的惠普V3159笔记本,心情一片大好,竟然装上以后运行正常了。出来混,迟早要还,之前一直对于拆机器的事情不感兴趣,现在可真是被逼得。
我终于可以去中关村赚取那90块的拆机费了: )
PS:今天中午修好了屋子里面的抽水马桶,心情一片大好。
posted @ 2010-07-12 13:07 meglory 阅读(209) | 评论 (0)编辑 收藏
非常简单的题目,没有方法可言。
1。之前忘记拿char读入的,所以直接把int和char相加所以结果一直很奇怪。
2。题目的数字会出现以0开头的非零数字,这个当初读题完全没有想到。但是看到discuss之后回去读题,发现题目确实题目没有说不可以。这个还是自己没有考虑周全。


posted @ 2010-07-11 01:47 meglory 阅读(237) | 评论 (0)编辑 收藏
vim使用进入一个新的阶段,多多熟悉新的命令。多多接触新的插件提高自己的效率。
之前用过一段时间source insight发现读代码确实很方便,现在的ctags+taglist也基本可以做到这些了。

ctags是一个类似也词法分析器的东东,能够把代码中的变量以及函数定义给分析出来成为tag
而taglist就根据ctags产生的tag来跳转,所以阅读代码和查找函数的时候都非常方便。基本Google一下就可以找到很多配置的文章。

现在记录一下常用的命令:
基本使用
在相应的源码目录运行ctags -R产生相应的tags文件
在有tags文件的源码目录下执行 vim 源码文件名 进入vim
VIM 启动时会在该目录查找tags文件,如果找到则自动加载。
使用 :TlistToggle 命令切换函数列表开关。
Ctrl+两下w 切换编辑区域和列表区域。
在列表区将光标移动到函数名上,回车即可查看。
可以在编辑区将光标移动到函数名上,使用 Ctrl+] 查看函数定义。

在taglist窗口中,可以使用下面的快捷键:
<CR>          跳到光标下tag所定义的位置,用鼠标双击此tag功能也一样
o             在一个新打开的窗口中显示光标下tag
<Space>       显示光标下tag的原型定义
u             更新taglist窗口中的tag
s             更改排序方式,在按名字排序和按出现顺序排序间切换
x             taglist窗口放大和缩小,方便查看较长的tag
+             打开一个折叠,同zo
-             将tag折叠起来,同zc
*             打开所有的折叠,同zR
=             将所有tag折叠起来,同zM
[[            跳到前一个文件
]]            跳到后一个文件
q             关闭taglist窗口

posted @ 2010-07-09 23:52 meglory 阅读(246) | 评论 (0)编辑 收藏
1.WA数次,因为边界的问题,把2也当成候选数了,没有留心two odd primes.
2.gcc编译math.h时,需要-lm.
3.如何从vim里面把代码拷出来提交到POJ的那个框框里面?我搞了半天没有解决

附:

gcc -l参数

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了


posted @ 2010-07-09 00:26 meglory 阅读(229) | 评论 (0)编辑 收藏
仅列出标题
共5页: 1 2 3 4 5 

导航

随笔分类

随笔档案

最新评论