2012年1月15日星期日

POJ 2159 Ancient Cipher(hash)

开始也是被简单的题目坑了。。。。考完试之后的第一道练手题啊,悲催 T_T
再细心看了一次之后,思路还是蛮清晰的。就是要求字符串中不同字母出现的次数一一对应。比如ABABC和DDEEF就应该是yes,如果是DDEEE就是no。但实现起来还是嫌麻烦。总是觉得有太多不需要的语句,很臃肿。涉及快排啊,比较啊。然后看到一个hash的算法就果断跪了 = =

题目归结为判断两个自然数多集(允许有重复元素的集合)a, b是否相等。用快排比较的效率是O(nlgn),下面提出一种O(n)的方法供大家参考。
 猜想:若 sum(a^i) = sum(b^i),i = 0, 1, 2, 则 a = b。 
证明:略。。。俺数学也不好  = = 


注意 :sum(s^0) 是多集s中元素的数目 
      sum(s^1) 是多集s中元素的和 
      sum(s^2) 是多集s中元素的平方和




追求代码的简洁之道。与其随便的实现,不如多花些时间去想。。。从小就懒啊,没办法



2011年12月14日星期三

转一段书评

from 豆瓣《我是一只IT小小鸟》


    一年多前,我到一位朋友家作客,他从学校已经毕业半年有余,没找工作,一直呆在家游手好闲。当时电视正在播电视剧《奋斗》,看了半集我问我朋友,这片子有什么好看么?而我朋友则一面严肃的表情说“你不懂,这片子特励志,不是你这种90后理解得来的”,并表示,等看完这部电视剧以后,自己马上也要开始奋斗;我没想到这种流行电视剧居然有如此“功效”,实在令我有点将信将疑。
 
  一年后,我再次拜访这位朋友,他依旧是无业流民,每天过着:上网-看电视-睡觉,三点一线的生活,还时不时跟我抱怨说,为什么别人刚毕业就有奥迪A6开,老爸一给就是两百万,用的诺基亚8800,都怪我爸妈不努力呀。
 
  我听完,心中满是唏嘘,心想,你要是一年前真的开始努力奋斗,即便现在没有大富大贵,起码也不必落得这斯田地。 

  同样地,适逢计算机专业成为最难就业专业,高校里有不知多少为仕途忧虑、对未来毫无概念的计算机专业学生,然后恰好这本书就出现了(这个时机决定了它必然是一本畅销书),那些迷惘的学生肯定是迫不及待地订购了一本,然后读到书上那些成功的学长学姐们,就如同我那位朋友看了励志电视剧一样——满腔的热血都被激发了,心中暗下目标,将来也要成为一只“小小鸟”,入主google,差一点的也要去个微软研究院什么的。 

  可是当他们实践起来的时候,才发现行动起来是如此的难,少了老师的填鸭,任何事情都变得寸步难移了:什么c/c++、java一点不会(老师还没教会我呢),linux难用得要死(之前我都是用windows的),搭个web服务器居然不能点鼠标来设置(linux的编辑器连鼠标不能用,天哪!)。。。一次次尝试之后,他们开始受挫,几次失败之后,他们放弃了,心想,都怪这本书,害我一时激动白费了那么多努力,维持现状不就够了,拿到文凭不就行了,折腾那么多干嘛? 

  励志形式的题材总会给人一种错觉,就是它们都把未来描绘得太美好了:那些读书的年轻人们,那些单纯而浮躁的年轻人们,一心只想着也给自己创造一个美好的未来,却对得到一个好的结果所要付出的代价和努力知之甚少,甚至充耳不闻。

  很多深陷泥潭的人,他们从来不去思考自身的困境,却满心期待着通过一本两本书、一部两部电视剧,希望从中得到启发,让自己脱胎换骨,那无异是痴人说梦;

  即便你真的能排除思想上的障碍,将计划付诸行动,在过个程中,也有无数这样那样的困难,挡住你前进的道路——这是一个漫长而艰苦的过程,决不是一时意气就能坚持下来的。

  你要做的,不是看几本励志书、重温几部像《奋斗》那样的片子,或者跑到小组上问像“学c++该看什么书“之类的蠢问题,而是应该把你脑子中那点渴望不劳而获的思想赶跑,把你从小到大养成的无须思考、等待答案的填鸭式教育带来的坏习惯改掉,然后,也是最最重要的——开始做实事,这就够了。

  看到满版评论都在为这本书喝彩,看到不少朋友立志成为“小小鸟”,我忽然有种毛骨悚然的感觉,毫不客气的说,我想这里面大部分人(如果不是全部的话)都会精神抖擞而去,垂头丧气而归。

  前几天一个刚大一的朋友问我一道很简单的c语言题目,我告诉他思路,说这道题用bit operator来做,他说不会,让我直接给答案,我希望他自己做出来,就跟他说我也不会你自己做,拉拉扯扯了一个多小时,最后他从网上搜出了一个答案交给老师。

  据他说,他们班上大部分人都是那么干的(每当老师从背后经过的时候总是胆战心惊),我对这群同年人有点失望,觉得学习不应该这样得过且过,随即又明白一个道理:很多时候,我们对别人的选择其实无能为力;

  开个玩笑,假如给我朋友那班的大一新生全部发一本《小小鸟》,他们就会认真对待自己的编程课吗?我想未必,因为他们本身都不愿意努力,我们对他指手划脚、好言相劝,又有什么用呢?


-------------------------------------------------------------------

个人觉得,一样东西的存在,总有它的道理,励志文学也是如此。虽然说执行力确实是另一回事,但起码会给人一个奋斗的目标。有动力,还需要持之以恒。找准方向才是第一要务。多花一点时间,思考一下人生的路,未来的路,未尝不是一件好事。技术无止境,找到真正属于自己的,适合自己的,才会事半功倍。

有时候确实会很迷茫,各种各样的技术与方向,那条才是自己的路。看过各种博客,也经常去请教师兄,始终不得其道。大概有些事,是真的要自己走过才能深有体会吧。

2011年12月10日星期六

POJ 1753 Flip Game 暴力。。。囧


这题跟先前那题基本一样,就不多说了 = =
很郁闷的是一样的题目一样的思路竟然效率还是那么低,总会有这样那样的小问题,然后debug来debug去,我勒个去啊~~~~~~
上网找了一下,用BFS + 位操作。。。。
喵的好高级 = =
队列实现的BFS。。。寒假回去恶补搜索啊囧~~


#include”cstdio”
#include”cstring“
#include”cstdlib“
char table[6][7];
char copy[6][7];
int firstline[5],count;
void change(int a,int b)
{
if(copy[a][b] == 'b')copy[a][b] = 'w';else copy[a][b] = 'b';
if(copy[a-1][b] == 'b')copy[a-1][b] = 'w';else copy[a-1][b] = 'b';
if(copy[a][b-1] == 'b')copy[a][b-1] = 'w';else copy[a][b-1] = 'b';
if(copy[a+1][b] == 'b')copy[a+1][b] = 'w';else copy[a+1][b] = 'b';
if(copy[a][b+1] == 'b')copy[a][b+1] = 'w';else copy[a][b+1] = 'b';
count ++;
}


int main()
{
int i,j,t,min = 16;
for(i = 1;i < 5;i ++)
scanf("%s",&table[i][1]);
for(t = 0;t < 16;t ++){
memset(firstline,0,sizeof(firstline));
int tmp = t,k = 1;          //WTF = =here the problem k which got me in trouble
while(tmp){                       //create a binary array
firstline[k] = tmp % 2;
tmp /= 2;
k ++;
}


memcpy(copy,table,sizeof(table));      //try to change to all white
count = 0;
for(k = 1;k < 5;k ++)
if(firstline[k] == 1)change(1,k);
for(i = 2;i < 5;i ++)
for(j = 1;j < 5;j ++){
if(copy[i-1][j] == 'b')change(i,j);
/*test function
for(int m = 1;m < 5;m ++){
for(int n = 1;n < 5;n ++)
printf("%c ",copy[m][n]);
printf("\n");
}
system("pause");
system("cls");
*/
}
for(j = 1;j < 5;j ++)
if(copy[4][j] != 'w')break;
if(j == 5 && count < min)min = count;   //mark the min


memcpy(copy,table,sizeof(table));     //try to change to all black
count = 0;
for(k = 1;k < 5;k ++)
if(firstline[k] == 1)change(1,k);
for(i = 2;i < 5;i ++)
for(j = 1;j < 5;j ++)
if(copy[i-1][j] == 'w')change(i,j);    //difference!
for(j = 1;j < 5;j ++)
if(copy[4][j] != 'b')break;
if(j == 5 && count < min)min = count;
}
if(min != 16)printf("%d\n",min);
else printf("Impossible\n");
return 0;
}