我如何看待宗教

一个月前,我去见了我的一个老师,她告诉我她成基督徒了。当然我听到后的第一反应是吃惊,这是因为她是我认识的第一个基督徒,以前最多见到过信佛的。然后她送了两本书给我,一本是《圣经》,一本是里程写的《游子吟》,并让我去解放碑的圣爱堂听了一次证道。再加上最近看的很多美国的电影与基督教有关系,以及和同学的一次聊天,我觉得我差不多可以写这篇文章了。
1.我的信仰
在和同学的聊天中,她问我信什么,基督?科学?我的回答是,最理想的状况是都不信,是质疑一切。
为什么要质疑一切呢?因为不论是基督教的观点,科学的观点,都不过是为了解释那些终极问题(世界从何而来?我是谁?之类)而存在的学说,它们都可以差不多自圆其说,也都可以漏洞百出。
本质来说它们是相同的,盲目的相信任何一个都是迷信。而唯有质疑,我们才能接近“上帝”(请参考什么是“上帝”,以后文中加引号的上帝均指此意,以区别宗教意义上的上帝)。可能很多人都会把信教的人说成迷信的人,认为自己是无有神论者就怎样怎样。首先,你不能说明别人信的教是骗人的,虽然很多科学证据证明圣经中的很多历史事件根本是虚构的,但是那些证据是很容易被推翻的,比如有科学家用技术手段测出地球的年龄与《圣经》写的完全不同,但是很快就有人说如果上帝可以创造世界,他难道就不能在造地球时让它看起来比实际老些吗?
而我,可以说我是一个没有信仰的人,或者说我信“上帝”。
2.什么是“上帝”
其实上帝不只是宗教所说的那样,其实我们可以这样理解上帝,“上帝”是绝对真理,是宇宙发展的规律。
所以才说“上帝”创造了万物,“上帝”主宰这世界。并且如果有人违背“上帝”的旨意,就会受到惩罚。
3.为什么现在的人们更相信科学
就我看来,其原因应该是科学看起来更接近“上帝”,即科学看起来更接近绝对真理。
科学在乎一点,就是一个理论不光能解释过去,还能预言未来。而后者正是宗教的软肋,宗教的许多预言是经不起考验的。
然而能预言未来是很重要的,人类物质生活上的进步很大程度上依赖于此。
所以更相信科学的人越来越多。
4. 我眼中的宗教
关于宗教中最受人质疑的问题,到底有没有神或者上帝。对于这个问题,正确的态度是我不知道。任何人都不能证明神或者上帝的存在与不存在,因为他们即使存在也是无法感知的,即他们的存在与不存在对我们来说看起来是没有区别的。当然,这里有一个例外,就是有些人讲他遇见过神或者上帝,如果他没说谎,他就知道神或者上帝是存在的,但是如果他来告诉你他遇见上帝了,你就需要质疑了。而还有一些更极端的哲学家提出了连人的感官都要质疑,如果到了这个程度,即使你真的见到神或者上帝也同样要质疑(比如,这可能是你的一个朋友玩的恶作剧)。也就是说如果你质疑一切,就不可能知道神或者上帝的存在与否。
如果质疑宗教中关于神的那部分,那么通常就谈不上信教了,那宗教还有什么意义呢?
并且虽然宗教在现在已然没有以前的地位了,但是为什么还有这么多人信教呢?
我认为,其原因一部分是人们还有对科学的质疑,人们发现还有一些问题是科学无法解释的(比如宇宙起源,现在只有假说),还有一些科学所给出的结论是无法被接受的(比如进化论,有些人无法接受人是猴子的近亲这个结论,准确的说它还不能叫结论,而是假说);一部分是因为科学更多的满足了人的物质需求,而有点忽视人的精神需求;还有一部分就是迷信了。
而我对宗教的态度更侧重于第二点,就是宗教可以丰富人的精神生活。
在圣爱堂听证道时,看到了许多虔诚的基督教徒,融入其中听牧师讲,教徒应和,只是这样就会让我有一些内心的震撼。而牧师所讲的内容多是一些故事,或取自《圣经》,或取材于现实,都在传播着如何做一个好人。而这不就是在丰富人们的精神生活吗?它让人们觉得做一个普通好人的意义大于一个黑心富商或腐败贪官。当然宗教活动不只是讲这一点,这是我听的那次我得到的感悟。
而这些正是我认为的宗教在现在最大的意义。
对于《圣经》,我认为,读《圣经》时,应该质疑其内容的真实性(否则就是迷信了),不可否认的是它的确宣扬着一些正确的价值观,也不能否认其中落后的思想,要学会有自己的判断。如果能做到这点,就能够真正得到《圣经》所传达的一直都适用的道理(也就是说,忽略掉了那些只适用于旧时代的道理),才能够从中得到上帝的正确的启示。

读韩寒的《给李彦宏先生的一封信》有感

3月26日的时候上微博,看到@新周刊的微博“韩寒给李彦宏先生的一封信——百度文库完全可以成为造福作家的基地,而不是埋葬作家的墓地。倘若百度文库始终不肯退一步,那我可以多走几步,也许在不远的某天,在您北京的办公室里往楼下望去,您可以看见我。http://t.cn/h11Mrm ”。便马上前往韩寒的博客,发现又有两篇更新,一篇是《为了食油,声讨百度》,还有一篇是《给李彦宏先生的一封信》。

读完后的感觉便是,百度太过分了!虽然承认我也用百度文库下载过韩寒的书,但是至少我这样做的时候还是怀着歉意的,而且我也到书店买过韩寒的书,算是道歉。而从韩寒的文中我们看到的是百度的狂妄自大。“于是昨天开始谈判了,您派来几个高傲的中层,始终不承认百度文库有任何的侵权行为。”我为百度的厚颜而感到伤心,因为这居然是中国最有技术的互联网巨头的态度,这叫人情何以堪。作为一个搞技术的公司,就应该像Google那样,要学习Google的不作恶,还有创新。而不是打着共享的口号招摇撞骗。

想起@冯小刚的一条微博。“有网友问我看过盗版吗?我得诚实的说,看过。但我决不敢理直气壮说看盗版有理。贪便宜人之常情,但你总得表现出有点不好意思吧?总不能以此为荣当美德显摆吧?就好比孩子嘴馋偷吃了别家的东西,你不追究他但也不至于鼓励他再接再厉吧。你横不能对孩子说,谁让他们家东西好吃呢?咱买不起你偷得对。”百度就是那个鼓励偷盗的家长,它想把大家都教成贼。

更让人伤心的便是,居然有人觉得当贼很好。“支持百度!作家只不过是想要点钱。”这样的评论出现在百度的《版权方绿色举报通道》下面。我这不知道这些人是怎么想的,人家百度自己都觉得理亏了,你跟着瞎嚷嚷什么,谁不想要钱,你不想要吗?不想要给我。别人想要钱,那是要的他们自己的,你当然觉得没什么。如果哪天大家都到你家来抢钱,你不反抗?除非你是一条狗,只会摇尾巴的那种!

好在,现在百度有所行动,虽然作用可能不会太大,但至少说明它知道做贼是不对的了。希望百度还要为维护作者的知识产权做更多的努力,希望中国的互联网巨头们都多创新,少作恶,多为广大用户着想,同时也多为那些利益被你损害到的少数人着想。

P.S.最新的一期《Vista看天下》讲百度文库的事情的时候居然没有花大篇幅写写韩寒,好失望哦。加油韩寒,支持你!

哲学启蒙[2009年8月14日-8月24日]

8月14日
==序==
在小徒弟的推荐下买了这本讲哲学的书,《苏菲的世界》。然后今天一口气就看了70多页,觉得这是一本很有意思的书。因为读这本书感觉像在看故事一样。看那位神秘的哲学家写给苏菲的信,以及那些古怪的问题,就不自觉的思考起来。
==读《伊甸园》==
苏菲的哲学课开始于一封神秘的信,信中只有两行字:
你是谁?
世界从何而来?
这两个问题使我想起了《武林外传》中吕秀才让姬无命自杀的那一段对话。你是谁?宇宙从何而来?又走向何方?
对于我,我是Su Jiao?可拿掉这个代号,我又是谁?我,是物质的我,还是精神的我。我的克隆算是我吗?灵魂,是否真的存在?
世界有真的是由一次无聊的爆炸而开始的吗?
很多的问题,疑惑。但是,很少有人去想这些,如果不是看到这本书,我才不会闲得无聊来思考这种问题。
==读《魔术师的礼帽》==
有一句话,“要成为一个优秀的哲学家只有一个条件:要有好奇心。”然后,记得在高一的一段时间里常常对同桌说:“不要有好奇心。”这是一件可悲的事,更可悲的是几乎所有人都在成长过程中一点一点的失去好奇心。
当有人告诉我们冰化了就会变成水之后,我们就会习惯“冰化了就会变成水”,而不会觉得冰变成水是一件奇妙的事了。或许这个例子举的不好,那么,讲一个书中的故事(书中称作思想上的测试):
有一天早上,爸、妈和小同正在厨房里吃早餐。过了一会儿,妈妈站起身来,走到水槽边。这时,爸爸飞起来了,在天花板下飘浮。小同坐在那儿看着。你想小同会说什么?也许他会指着父亲说:“爸爸在飞。”小同当然会觉得吃惊,但是他经常有这样的经验。爸爸所做的奇妙的事太多了,因此这回他飞到早餐桌上方这件事对小同并没有什么特别的。每天爸爸都会用一个很滑稽的机器刮胡子,有时他会爬到屋顶调整电视的天线。或者,他偶尔也会把头伸进汽车的引擎盖里,出来时脸都是黑的。好了,现在轮到妈妈了。她听到小同说的话,转身一瞧。你想她看到爸爸像没事人一般的飘浮在餐桌的上方会有什么反应?她吓得把果酱罐子掉在地上,然后开始尖叫。等到爸爸好整以暇地回到座位上时,她可能已经需要急救了。
为什么会这样?书中写的是,因为习惯。妈妈已经知道了人不可能飞起来,而小同仍不确定人能做什么以及不能做什么。
当我们习惯了一些事物,然后思维就会受起束缚吧。
8月15日
==读《神话》==
神话,原来是用来解释这个世界为何是这个样子的。因为古人不知道世界从何而来,于是有了盘古开天,有了上帝创世。因为不知道雷是什么,就有了雷公,有了索尔和他的铁锤。
因为无法用已有的知识解释一些现象,于是只有用非自然的力量来解释,然后就出现了神话。
现在,尝试着忘记所学过的所有知识,然后编写一个美丽的传说。
==读《自然派哲学家》==
又是几行文字,几个问题:
万事万物是否由一种基本的物质组成?
水能变成酒吗?
泥土与水何以能创造出一只活生生的青蛙?
试着忘掉我所学的东西,然后想。如果世界由一种物质构成,那么为何世界会缤纷多彩?是因为感官的幻觉?或者是因为他们的不同组合导致的,就好像用砖可以砌成各式各样的建筑,然后,是什么把他们组合在一起,什么来充当水泥的角色?还有,他们是如何移动,变化的。看样子还需要引入一些东西,那或许就是我们所谓的力了。如果世界由多种物质组成,我不同意。因为如果有多种物质,那么他们也应该可以分割为更小的更基本的物质。就好像水分子可以分割成氢原子和氧原子,氢原子又可以分隔成质子和电子(有时会还有中子)。然后我想到一个更合理的观点,世界应该由两种最基本的物质组成,然后他们就可以组合成万物,而且这样也不会需要引入力这个未知的概念(因为我在试着忘记这些东西,然后来思考这个问题,就像古人一样思考)。
水能变成酒吗?如果按照前一个问题所得出的结论,答案是可能。然后,回到现实,想起了初中化学老师讲的一个笑话:
中国差点将“把水变石油”这个课题拿来研究,想制造一台机器,灌水给它,就流出石油了。后来因为有科学家讲这不合理(不符合原子守恒,至少水中没有炭原子),才被终止。但事实上这从理论上讲是可能的,原子是可变的,例如氢原子聚变就可以变成氦原子,而且在元素周期表中所有铁之前的元素对应的原子都有聚变的趋势,之后的都有裂变的趋势。只是有的快有的慢。快的,比如原子弹的铀235的裂变,以及太阳和氢弹的氢的聚变。而且在太阳中氢“变”氦后,氦还会继续“变”。
该看第三个问题了。如果把泥土和水当作两栋建筑,青蛙当作一栋待建的建筑。那么要做的就是拆东墙补西墙了。
8月16日
==读《德谟克里特斯》==
又是一个问题,积木为何是世界上最巧妙的玩具。
苏菲起先并不认为积木是世界上最巧妙的玩具,但当她玩了一阵后,改变了看法,积木似乎真的很好玩。然后,为什么呢?苏菲的结论是积木可以随意组合,还可以随便拆散。并且积木几乎不会摔坏。
然后,这个问题有什么意义呢?往下看,来到了原子理论。看看古人如何仅仅凭借理性的思考就得出了这个结论。
德谟克里特斯,这个人,他认为世界是由无数原子组成的(原子,atom,本意“不可分割的”)。这些原子形状各异,然后它们就像积木一样,可以组成各种事物,也可以分解掉。原子可以分散然后重组。
慢慢地,古代哲学家的思想开始向现代靠拢,由假想神话开始转向了理性的思考。
==读《命运》==
信中又有三个问题。最感兴趣的是这一个,“你相信命运吗?”
对于这个问题,我的观点是,我相信。我相信未来是已经确定了的。我过去、现在、以及将来做的事在宇宙一开始的时候就已经确定了,而且没法改变。我如此认为原因是某一时刻各个质点的状态是确定的,宇宙的法则是确定的,所以以后的状态也是确定的。那么,宇宙的0时刻的状态是确定的,以后的时刻也是确定的,那么,宇宙中的所有事物在任何时候的状态都是确定的。因此,我觉得我相信命运。但是,从另一个角度来说,如果一切早已命中注定,那么我们是不是不需要努力了(因为刚才的结论是我们的命运早已注定,不可改变)。我认为事实上真的是这样,不过有一个好消息,我们是否会努力也是命中注定了的。而且由于我们并不知道未来我们会怎样,所以感觉上是我们努力了,就有收获了。
然后,一个题外话,霍金说过,“即使是一个相信命运的人,过马路时也会左右看看。”他的意思是一个人如果相信命运,那么那个人过马路时就不必左右张望,因为如果命中注定他要被撞死的话,望也没有用。但是,其实那个人是否会张望本身也是命中注定了的。
好累啊,我要睡觉了。这也是命中注定的。
8月17日
==读《苏格拉底》==
很喜欢文中的一句话,最聪明的是明白自己无知的人。还有苏格拉底讲的一句话,“我只知道一件事,就是我一无所知。”
记得应该是政治课上,老师有讲古希腊的奴隶主不用干活,一天就找人辩论,所以西方出现了比东方先进的理论。然后,看到这一章,发现苏格拉底就是这样一个人。
==读《雅典》==
苏菲收到了一卷录影带,录影带中是那个神秘的哲学家在雅典拍摄的内容,现在的,和以前的雅典。
8月19日
==读《柏拉图》==
柏拉图是苏格拉底的学生之一,他开办了一个哲学学校,并以传奇中的希腊英雄阿卡戴慕士为名,这个学校被称为Academy(也就是以后的“学院”)。
然后,同样是对话式的上课,之所以说同样,是因为东方的孔子也是这样教学的。这使我想把他们拿来比较了。
读过论语就知道,孔夫子所谈论的是仁、义、礼、信之类的,大多是讲如何做人,如何格物,致知,修身,齐家,治国,平天下。那么,柏拉图又谈论什么呢?读了一阵,出现了一个词,理型。因为书中有一句“柏拉图称这些形式为‘理型’或观念”。所以“理型”应该是和“观念”等价的。继续看,有一个例子。老师问学生们最喜欢哪种颜色,答案会很多。老师问3乘8得多少,答案只有一个。后者之所以只有一个答案,是因为理性在起作用,理性只表达永恒不变、宇宙共通的事物。然后,值得一提的是在柏拉图的学校的三个科目中有数学(另两个是哲学和体育)。柏拉图认为数学很吸引人,因为数学是理性的。同时,想,中国对数学这方面的理性的研究相比于西方是很落后的吧。
柏拉图还将世界分为感官世界和理性的世界。他相信人有肉体与灵魂之分。并且肉体是感官的,灵魂是理性的。然后他也提出了自己的理想国。
信的最后,提到了一个人,柏拉图的学生,亚理士多德,将会在后面写他。
8月21日
==跳过《少校的小木屋》==
==读《亚理士多德》==
亚理士多德对柏拉图的理型论提出了质疑,柏拉图的理型论指出事物要存在于理型世界后才能存在于自然世界。就是先有X的“理型”,再有X。而亚理士多德的疑问就是如果柏拉图的理论正确,那么,我们设有一个事物A,设函数f(x)表示x的理型,那么,先前的那句话就是,All  A,Exist  B(B=f(A)),即对于所有A,存在B,满足B=f(A)。而得出有一个C=f(B),又有一个D=f(C)…所以会导致事物数目无限制的增长,也就是说会导致无穷多的事物出现,因此不合理。亚理士多德认为我们是通过感官,归纳(即理性的整理与分类)而得到概念(即“理型”)。
一个好玩的东西是一个亚理士多德提出的错误(强调,这是不符合因果律的,是错的)的理论,“目的因”。用“目的因”解释一些问题会很好玩。比如,“天为什么要下雨呢?”“因为它淋到我,我会觉得凉快些。”这就是“目的因”,也就是说天下雨的目的是让我觉得凉快,所以天下雨的“目的因”是让我觉得凉快。
那为什么我还没睡呢?
哦,因为我数羊还没数到一百只呢。
8月22日
==读《希腊文化》==
亚历山大大帝建立了一个跨亚欧非的庞大帝国,使得各种文化相互交融。出现了百家争鸣的情景。
介绍了四个学派,其中伊比鸠鲁学派的一个观点很有趣,“死亡和我们没有关系。因为我们存在一天,死亡就不会来临;而当死亡来临时,我们也不再存在了”。
==跳过《明信片》==
==读《两种文化》==
这一章里讲到了印欧民族的文化和闪族文化。讲的是关于宗教信仰的内容。
其中闪族文化下的宗教,犹太教、基督教、伊斯兰教,是西方三大宗教。
花了很大篇幅讲了一个人,耶稣。耶稣以“救世主”的姿态出现,他告诉世人要宽恕别人,别人打了你的脸,你要把另外一边脸转过来让别人打。还要悔改自己的过失,并祈求上帝的宽恕。后来,耶稣被钉上了十字架,之后保罗四处传教,之后的三四百年之间,整个希腊文化地区都成为基督教的世界。 
8月24日
==结束==
前天晚上看这本书看到了12点,才极不情愿的被叫着去睡觉了,然后,昨天有一口气看了可能有一百页吧。就快看完了。
这部分中的内容更加故事化,就是讲的更像故事而不是哲学,情节很迷人,仿佛上帝的影子在慢慢浮现。
本来打算写完整本书的读后感,但是由于还要赶作业的缘故,可能不能完成了。所以,打算今天就结束这篇日志。
在之后的内容里,还会讲到达尔文的进化论,以及伽利略和牛顿提出的一些定律,然后还讲了弗洛伊德在心理学的一些观点,马克思的想法……
总之,这是一本不错的书。

NOIP2010

最后一次NOIP了,390(最后一个程序dfs改快一点就可以400最后一个题有更好的算法,O(n^2)的)。


代码贴在这里,题解网上已经有了,就不必写了。


CODE:


/*


AUTHOR: Su Jiao


DATE: 2010-11-20


DESCRIPTION:


$DESCRIPTION


*/


#include <stdio.h>


 


#define PROBLEM “translate”


FILE* file;


 


const int QUEUE_SIZE=1<<20;


int M,N;


int queue[QUEUE_SIZE];


bool in_queue[QUEUE_SIZE];


int head,tail;


int answer;


 


int main()


{


    file=fopen(PROBLEM“.in”,“r”);


    fscanf(file,“%d%d”,&M,&N);


    for (int i=0;i<N;i++)


    {


        int word;


        fscanf(file,“%d”,&word);


        if (!in_queue[word])


        {


           in_queue[queue[tail++]=word]=true;


           if (tail-head>M)


              in_queue[queue[head++]]=false;


           answer++;


        }


    }


    fclose(file);


    file=fopen(PROBLEM“.out”,“w”);


    fprintf(file,“%d\n”,answer);


    fclose(file);


    return 0;


}


 


#include <stdio.h>


 


#define PROBLEM “tortoise”


FILE* file;


const int MAXN=1<<10;


const int MAXCARD=1<<6;


const int MAXCARD_NUMBER=1<<3;


int N,M;


int a[MAXN];


int card[MAXCARD_NUMBER];


int f[MAXCARD][MAXCARD][MAXCARD][MAXCARD];


 


int main()


{


    file=fopen(PROBLEM“.in”,“r”);


    fscanf(file,“%d%d”,&N,&M);


    for (int i=0;i<N;i++)


        fscanf(file,“%d”,a+i);


    for (int i=0;i<M;i++)


    {


        int b;


        fscanf(file,“%d”,&b);


        card[b]++;


    }


    fclose(file);


    for (int i1=0;i1<=card[1];i1++)


        for (int i2=0;i2<=card[2];i2++)


            for (int i3=0;i3<=card[3];i3++)


                for (int i4=0;i4<=card[4];i4++)


                {


                    int get=a[1*i1+2*i2+3*i3+4*i4];


                    if (i1>0&&f[i1][i2][i3][i4]<f[i1-1][i2][i3][i4])


                       f[i1][i2][i3][i4]=f[i1-1][i2][i3][i4];


                    if (i2>0&&f[i1][i2][i3][i4]<f[i1][i2-1][i3][i4])


                       f[i1][i2][i3][i4]=f[i1][i2-1][i3][i4];


                    if (i3>0&&f[i1][i2][i3][i4]<f[i1][i2][i3-1][i4])


                       f[i1][i2][i3][i4]=f[i1][i2][i3-1][i4];


                    if (i4>0&&f[i1][i2][i3][i4]<f[i1][i2][i3][i4-1])


                       f[i1][i2][i3][i4]=f[i1][i2][i3][i4-1];


                    f[i1][i2][i3][i4]+=get;


                }


    file=fopen(PROBLEM“.out”,“w”);


    fprintf(file,“%d\n”,f[card[1]][card[2]][card[3]][card[4]]);


    fclose(file);


    return 0;


}


 


#include <stdio.h>


 


#define PROBLEM “prison”


FILE* file;


const int MAXN=1<<20;


const int MAXM=1<<20;


const int UNCOLORED=-1,RED=0,BLUE=1;


struct Prison{int a,b,c;};


struct struct_edge{int v;struct_edge* n;};


typedef struct_edge* Edge;


int N,M;


Prison prison[MAXM];


Edge adj[MAXN];


struct_edge pool[MAXM*2];


Edge top;


int color[MAXN];


int answer=(~0u)>>1;


 


void quick_sort(int l,int r)


{


     int i=l,j=r,mid=prison[(l+r)>>1].c;


     while (i<=j)


     {


           while (i<=j&&prison[i].c>mid) i++;


           while (i<=j&&prison[j].c<mid) j–;


           if (i<=j)


           {


              Prison swap;


              swap=prison[i],prison[i]=prison[j],prison[j]=swap;


              i++,j–;


           }


     }


     if (l<j) quick_sort(l,j);


     if (i<r) quick_sort(i,r);


}


void add_edge(int u,int v)


{


     top->v=v,top->n=adj[u],adj[u]=top++;


     top->v=u,top->n=adj[v],adj[v]=top++;


}


void build_graph(int end)


{


     top=pool;


     for (int i=1;i<=N;i++) adj[i]=0;


     for (int i=0;i<=end;i++)


         add_edge(prison[i].a,prison[i].b);


}


bool color_node(int u,int which_color=RED)


{


     if (color[u]!=UNCOLORED) return color[u]==which_color;


     else


     {


         color[u]=which_color;


         for (Edge i=adj[u];i;i=i->n)


             if (!color_node(i->v,!which_color)) return false;


         return true;


     }


}


bool is_binary_graph()


{


     for (int i=1;i<=N;i++) color[i]=UNCOLORED;


     for (int i=1;i<=N;i++)


         if (color[i]==UNCOLORED)


            if (!color_node(i)) return false;


     return true;


}


 


int main()


{


    file=fopen(PROBLEM“.in”,“r”);


    fscanf(file,“%d%d”,&N,&M);


    for (int i=0;i<M;i++)


        fscanf(file,“%d%d%d”,&prison[i].a,&prison[i].b,&prison[i].c);


    fclose(file);


    quick_sort(0,M-1);


    int L=0,R=M;


    while (L+1!=R)


    {


          int mid=(L+R)>>1;


          build_graph(mid);


          if (is_binary_graph()) L=mid;


          else R=mid;


    }


    if (R!=M) answer=prison[R].c;


    else answer=0;


    file=fopen(PROBLEM“.out”,“w”);


    fprintf(file,“%d\n”,answer);


    fclose(file);


    return 0;


}


 


#include <stdio.h>


 


#define PROBLEM “flow”


FILE* file;


const int MAXN=1<<10;


const int MAXM=1<<10;


const int oo=(~0u)>>1;


int N,M;


int height[MAXN][MAXM];


int color[MAXN][MAXM];


int adjs[MAXM];


int adj[MAXM][MAXM];


bool watered[MAXM];


int unwatered;


int begin[MAXM];


int end[MAXM];


int f[MAXM][MAXM];


int need;


 


void dfs(int x,int y,int start)


{


     if (color[x][y]!=start)


     {


        color[x][y]=start;


        if (height[x+1][y]<height[x][y]) dfs(x+1,y,start);


        if (height[x-1][y]<height[x][y]) dfs(x-1,y,start);


        if (height[x][y+1]<height[x][y]) dfs(x,y+1,start);


        if (height[x][y-1]<height[x][y]) dfs(x,y-1,start);


        if (x==N) adj[start][adjs[start]++]=y;


     }


}


 


int main()


{


    file=fopen(PROBLEM“.in”,“r”);


    fscanf(file,“%d%d”,&N,&M);


    for (int i=1;i<=N;i++)


        for (int j=1;j<=M;j++)


            fscanf(file,“%d”,height[i]+j);


    fclose(file);


    file=fopen(PROBLEM“.out”,“w”);


    for (int i=1;i<=N;i++) height[i][0]=height[i][M+1]=oo;


    for (int i=1;i<=M;i++) height[0][i]=height[N+1][i]=oo;


    for (int i=1;i<=M;i++)


        dfs(1,i,i);


    for (int i=1;i<=M;i++)


        for (int j=0;j<adjs[i];j++) watered[adj[i][j]]=true;


    for (int i=1;i<=M;i++)


        if (!watered[i]) unwatered++;


    if (unwatered)


       fprintf(file,“%d\n%d\n”,0,unwatered);


    else


    {


        for (int i=1;i<=M;i++)


        {


            begin[i]=oo,end[i]=0;


            for (int j=0;j<adjs[i];j++)


                begin[i]=begin[i]<adj[i][j]?begin[i]:adj[i][j],


                end[i]=end[i]>adj[i][j]?end[i]:adj[i][j];


        }


        f[0][0]=true;


        for (int i=1;i<=M;i++)


            if (begin[i]<=end[i])


               for (int k=1;k<=M;k++)


               {


                   if (f[k-1][end[i]]) f[k][end[i]]=true;


                   for (int j=begin[i]-1;j<=end[i];j++)


                       if (f[k-1][j]) f[k][end[i]]=true;


               }


        for (int i=1;i<=M;i++)


            if (f[i][M])


            {


               need=i;


               break;


            }


        fprintf(file,“%d\n%d\n”,1,need);


    }


    fclose(file);


    return 0;


}


 

64匹马能否通过50场比赛比出任意两匹马之间的优劣(每场比赛至多8匹马参赛)

这是2009年清华大学自主招生数学试题(理综)。


思考时间,答案在下面(字体是白色的)。


这道题其实考的是归并排序。


首先将马分为8组,每组排一下序,就比了8场。


然后再将这8组合并为4组,两两合并。


比如A和B组合并:


选A组的前4名和4个B组的前4名,比一场,如果从A中的选出的第4名比B中选出的第4名排名高,那么在A中的选出的第4名前和他自己一定是这些马中靠前的,于是把他们排到新的队中,其余马回到原来的位置;否则,同理分析。所以这样比一场可以确定至少4匹马在新的小组中的的位置。


接下来在剩下的马中继续这样做,直到所有马在新的小组中的位置都确定了。


由于每次都可以至少确定4匹马的位置,而且最后还剩8匹马时只需要比一次就可以确定8匹马的位置,所以两个8匹马的有序的小组合并为一个16匹马的有序小组只需要(16-8)/4+1=3次比赛。


所以8个8匹马的有序的小组合并为4个16匹马的有序小组需要4*3=12次比赛。


所以4个16匹马的有序的小组合并为2个32匹马的有序小组需要2*7=14次比赛。


所以2个32匹马的有序的小组合并为1个64匹马的有序小组需要1*15=15次比赛。


所以一共只需比49场就可以了。