Apr 30

         刚才,看了一下牛人们写的感想,有很大感触啊!

        首先,必须得说一下,要感谢我们那些老队员,为了训练我们,花了不少时间和精力,尤其是上次宋学辉精心为我们准备了几道dp训练题,却收到很不好的效果,后来宋学辉发了一下小牢骚,现在想想,他确实是挺郁闷的,发点小牢骚是很正常的,因为我们这些新队员,完全浪费了他们一番苦心,我们得好好反省一下,以后应该认真对待每一次训练。

        以前,总以这个学期课程紧,没有时间为借口,花在ACM团队的时间比较少,现在,看了这些牛人的感想,觉得自己以后,再也不能以没时间为借口了,以后应该多花一些时间在这里面了。在这里,顺便说一下个人小想法:每次出的训练题,能不能提供一下解决同一类问题的相关论文,因为对于我们这些没有基础的新成员,对于有些题型,完全不知道转化为哪类题型的话,做这样的题,我个人觉得就是白白浪费了很多时间,因为现在我们时间确实很紧,哈哈~~。

Apr 20

        昨天在武大被虐,很是郁闷。。。

        关键原因还是自己水!平时训练难度不够

        一直以来我们队都是坚持每周都做一、两次比赛(其他oj上的月赛和周赛),但是对于每次比赛的不尽如意的结果都不是特别注意,认为是自己思路没打开。有些题目本可以出的,但是因为时间或者题意没看清就开敲,没做出来,是不应该的。

        武大这次现场赛,没有做好,对我们队是个打击。如果在区域赛中清华、北大、交大等各路高手都来了,有压力,那这次比赛怎么说了,被一群高中生……,大部分队伍还是武汉本地的。电工那边还有两个队在前面。失败……。

        前事不忘,后事之师。

        1、队伍内部缺乏交流:虽然我们对的三个基本一人专攻一个方向,但对某些简单的建模大家都会,这次比赛中有个数论的题,是个出的最早的题,我和sxh一看是数论就交给了gq,gq在数论方面比我们两个都好,可惜他拿到那个题目,想偏了,一直没出,在比赛即将结束的时候,却在我们三人的讨论中得到了正确的思路,如果我们当时没有着急去看别的题,大家讨论一下,就不至于杯具了。。。,而另外一个“麻将题”,在sxh和gq的讨论中顺利1y ……

        2、陷入困境,不知自拔:当我们看到自己熟悉的题型时,就想把它a了,特别的是有别的队伍出了的那个题,这个想法越是坚定。在题意清楚、方法明确,交上去却过不了的题,会一直把它放在心里,不知道自己已陷入出题人的陷阱,这次比赛有个费用的流的题目,我用费用流交却怎么都是wrong,最后还是在队友的提醒下,换用km才过,(到现在还是没明白当时的费用流有什么bug,要好好思考了)

        3、平时训练强度不够:可能因为自己高中没有搞过oi,基础知识不是很扎实,加入集训队后也一直是单攻图论这一个方向,平时训练的时候看到dp,数论,计算几何啊,都放过了,因为图论也要用到很多其他方向的知识,很多综合题都做不来,但我却一直也没有找时间弥补其他。sxh和gq都是高中时搞过的oi的,他们比我全面,比赛时候经常要打断他们,请求一些最基本的dp……,杯具,以后的训练中我会注意其他方向基础知识的储备!

        精诚所至,金石为开。相信我们如果付出汗水,一定会有回报。

        继续努力。。。

Apr 19

    昨天比赛回来的路上,大家基本上没怎么说话,心情都很沉重。看到宋的表情,我知道我们让他失望了。

    痛定思痛,我认真地回想了这段时间的训练和比赛的整个经过。其实这段时间(2周以来)自我感觉训练效果是不错的,每次队内pk赛很多自己都能拿上来就做,在比赛之前,我一直自我感觉良好。到了现场我发现这是错觉。总体自身的原因,我个人觉得有以下,希望各位能提出宝贵的意见:

1.平时的训练懒散,虽然很多题目有思路,却不紧不慢地要做很长时间,没有全身心地投入。多说一句,平时的训练相对来说是简单的,个人希望出题者把题目梯度化。

2.比赛策略上有重大错误。拿到赛题后,我认为第一题能做,于是直接卡在了A题上,花去了近比赛一半的时间。而我这段时间一直研究的C题博弈,直接因为没有时间看题被放弃。直到比赛还有一个多小时的时候才开始看“麻将”题,随即拍了30分钟的代码,但是因为大家都想写题抢机子,这题的调试直接被放弃,非常可惜。

3.自己的能力不足。说某题水水水,但是为什么没有出来?不要给自己找借口,自己没出的题水只能说明自己更水。我认为这次的比赛对我来说,没有一题水,因为即便是“麻将”模拟题我也没能在40分钟内把他出来。是自己学艺不精,我会在接下来的训练中,更注重深度。

Apr 6

先上来顶一下,老宋辛苦了。

武大的邀请赛绝对是个打击啊,以后还要好好练。

  by kitt

Apr 5

   武大邀请赛做的很烂,连普通的水题都做得不太好,主要因为我自己训练不够,从上学期加入这个团队到现在一直都处于一个懒散的状态,没有认真看书,没有认真Coding,没有努力,来机房也很少,自然也就会落后于以前的一些同学,还有6~7个月了,我觉得也没有什么多说的,我一定会认认真真的来对待训练和比赛,对得起你们对得起团队对得起自己。

Apr 5

前几天有新成员问到我关于代码规范的问题。关于代码规范,google就能找到很多的文档,我这也有一些。其实不同的环境, 不同的公司有不同的代码规范,没有一个统一的规定。但为了促进团队间代码的交流,和方便以后比赛时队友之间的代码查错,我整理了一份规范,请大家尽量遵守。内容如下:

1. 空行(4条规则) :
空行起着分隔程序段落的作用,空行使得程序的布局更加清晰。
【1-1】在函数内部局部变量定义结束之后处理语句之前要加空行。
【1-2】在每个函数定义结束之后都要加空行。参见示例1-1(a)。
【1-3】函数返回语句和其他语句之间使用空行分开。
【1-4】在一个函数体内,逻辑上密切相关的语句之间不加空行,其它地方应加空行分隔。

// 空行 
void function1( ) { 
    … 
} 
// 空行 
void function2( ) { 
    … 
}
// 空行 
void function3( ) { 
    …
} 
// 空行
while (condition) {  
    …
    // 空行
    if (condition) {
        …
    }
    else {
        …
    }
    // 空行
    …
}

2.代码行(5条规则)
【2-1】一行代码只做一件事情,如只写一条语句。这样的代码容易阅读。
【2-2】if、for、while、do 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}表明是一个语句块。
【2-3】左花括号与语句同行(不要另起一行),右花括号要单独占一行。但是在do-while、struct和union及其后有‘;’的除外,要同在一行。
【2-4】switch语句中的每个case语句各占一行,当某个case语句不需要break语句最好加注释声明。
【2-5】并列的语句行应该按照字母顺序排序,如变量定义和switch中的case语句等。

if (condition) {  //左括号不要另起一行
    statement1;
}
else {
    statement2;
}     //右括号与相应语句对齐
do {
    statement3;
} while();

3.代码行内的空格(7条规则)
【3-1】关键字之后要留空格。像int、const、case 等关键字之后至少要留一个空格,否则无法辨析关键字。
【3-2】函数名之后不要留空格,紧跟左括号“(”,以与关键字区别。例如:void calc(void);
【3-3】“,”之后要留空格,如function(x, y, z)。如果“;”不是一行的结束符号,其后要留空格。
如for( initialization; condition; update )。
【3-4】不要在单目运算符(如“!”、“~”、“++”、“--”、“&”)和其操作对象间加空格。
例如:!foo,++i,(long)getValue
【3-5】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符。
如“=”、“+=”、“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。
【3-6】像“[]”、“.”、“->”这类操作符前后不加空格。
例如:big.bar,pFile->bar,big[bar]
【3-7】“(”的右边,“)”的左边不要加空格
 

//良好的代码
void func(int x, int y, int z);	
if(year >= 2000)
if(a >= b && c <= d)	
for (i=0; i < 10; i++)
x = a < b ? a : b;	
int *x = &y;	
array[5] = 0;
a.function();
b->Function();

4.对齐(3条规则)
【4-1】程序的分界符“}”应独占一行并且位于同一列,同时与引用它的语句左对齐,分界符“{”不用独占一行紧跟在语句后。
【4-2】水平缩进每次使用四个空格即可(建议定义一个tab键为四个空格)。
【4-3】同属于一个语句块的代码对齐。
 

5.长行拆分(2条规则)
【5-1】代码行最大长度宜控制在70至80个字符以内。代码行不宜过长,否则不便于阅读,也不便于打印。
【5-2】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
 

 

if ((very_longer_variable1 >= very_longer_variable2)
&& (very_longer_variable3 <= very_longer_variable4)
&& (very_longer_variable5 <= very_longer_variable6)) {
    dosomething;
}

virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix,
CMatrix rightMatrix);

for (very_long_initialization;
very_long_condition;
very_long_update) {
    dosomething;
}

if ((very_longer_variable1 >= very_longer_variable2)
&& (very_longer_variable3 <= very_longer_variable4)
&& (very_longer_variable5 <= very_longer_variable6)) {
    dosomething;
}

6.标识符命名(2条规则) 
标识符的命名规范很复杂很繁琐,这里只针对ACM比赛列两条命名的基本原则,对该项感兴趣的同学请自行查阅相关资料:
【6-1】含义清晰,不易混淆。
例如动态规划时的状态数组可以命名为dp[][]或是f[][],深度优先搜索的函数名可以命名为DFS,线段树的结构体可以命名为segTree
【6-2】不与其它模块、函数的命名空间相冲突。 避免用map、max、abs、sort等标识符命名函数,避免和库函数冲突。

7.常量(3条规则)
C 语言可以用const 来定义常量,也可以用#define 来定义常量。但是前者比后者有更多的优点:
(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换过程中可能会产生意料不到的错误。
(2) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。
【7-1】尽量使用const定义常量替代宏定义常量。
【7-2】用常量定义数据范围,避免不小心把范围写错后修改一堆数组的大小,这里建议使用define。例如:
 

#define M 1000
int pre[M], next[M], dp[M][M], a[M][M];  
vector <int> edge[M]; 

【7-3】函数宏的每个参数都要括起来。
例如:#define WEEKS_TO_DAYS(w) (w*7)
应该写成:#define WEEKS_TO_DAYS(w) ((w)*7)
这样在翻译totalDays=WEEKS_TO_DAYS(1+2)时,才能够正确地翻译成:(1+2)*7;否则将错误地翻译成1+2*7。
建议这里使用内联函数。如:
 

inline int lowbit(int x) {
    return x & (-x);
}
Apr 5

首先,我是沙发,这个是要强调的!!

然后是主题了。想必大家经历了这次网络赛,应该受了不少打击对吧?

我们的实力还很弱,不仅仅是说新成员们,包括我们在训练的老队员们。

总结一下我们队伍里的一些情况。这里为了叙述方便,我把我们整个团队分成了新成员和老成员两种人,并不是有意的分裂,团结是整个团队的大背景!

第一,团队成员缺乏积极性。

新成员方面,训练做题是被动的,看书也是被动的。这三次队内的PK赛,就不是所有人都参加了的,参加了的也有人不积极做题。一个星期的时间,怎么样都要保证10题里面能AC掉7题才对。我们出题的目的,一是让大家连手,二是让大家自主学习相关的知识,有多少人想到说,这个算法我不会,先百度一下这个算法,学了然后再做?老队员出一次题,找题要花掉半天功夫,出出来的10题,我们都要做出来,你们可能偷懒只做了一题,但是我们却要10题都做,这占用了我们相当的时间,却也不会有什么训练成果。说句不太客气的话,如果每次都不认真对待,你们非常对不起学辉。当初我跟学辉的大一都是被放任自流,前辈们在备战ACM,没人有精力管我们。

老成员方面,虽然我和学辉是所有人中资历最浅的,但是我也想指出,我们的积极性也不够。大家也扪心自问一下,大家在机房平均一周露几次脸?平均一周做几题?诚实的说,我自己做的也不好。这一点,我很推勇哥,很佩服他。我们实力还太弱,我们不能止步于银牌,我们要向金牌冲击才行!每个星期都有比赛,我们精力也不多,但是能不能多做做比赛练一练呢?

第二,团队成员缺乏交流。

一方面是新老成员间交流很少。我们这团队里20多号人,大部分人都是零基础的,为什么不多问多交流呢?学习思想,学习代码,这是很有好处很有必要的。我想大家应该都认识我们,应该都知道我们还是很乐意帮助大家的,那么,还有什么好害羞不问的呢?

另一方面是新成员之间缺乏交流。比赛完的晚上,蒋导找了我和学辉还有几位成员来交流,交流中我才知道,原来新成员之间还有许多人互相不认识。我想,这应该是我和学辉的错,我们疏忽了这一点。但是我也要指出,人和人之间的交流,要主动!新成员之间,遇到的问题会多种多样,也会有许多相似之处,讨论解决问题要比请教老队员解决问题印象要来的深刻。所以,多讨论多讨论,对大家的进步非常有好处的。

第三,讲一讲我们以后有可能的安排。

我们还会继续在HDU上挂比赛题,这次比赛之后可能就会开始专题训练,从现在开始到期末,可用的时间约有10周左右,我们可能还是会,一周一套题的策略来训练大家。大家好好珍惜这个机会吧,到了暑期集训就要转变模式,老队员们也要把精力放在自己身上了。

我们还可能实行考勤制度,对于新老成员都要考勤,但是具体的细节现在还在商讨中,我们会起草一个草案让大家来给意见。

另外,大家的机房机器要固定下来,不要每次一来就随便坐。大家要在这里找到归属感!

最后说一句,我们ACM团队是你展现自我的平台,如果你只是想混个名声,please get out!既然大家成为了ACM团队的一员,那么就请把你对自己负责,对团队负责;既然大家都没有退出,那么就把ACM重视起来。不要看它有多么的功利,要看我们有怎样的功力。我希望大家进来这个团队,就要有所收获,收获不仅仅是比赛荣誉,个人技术,还有精神层面的收获。我希望ACM团队会成为大家在学校的另外一个家,大家共同为这个家努力奋斗!