今天我写了一个用SPFA求最短路的小程序,Penhu同学想让我给他一个伪代码,于是我写了一个”SPFA.wdm”。为了有意思起见,我煞有其事地创造了一种完整的程序设计语言。因为wdm没有实际意义,因此改名DSL(Damn Simple Language)。写完后,Gedit自作聪明地用VHDL的语法给程序染了色,还真像那么回事。实际上,后来发现VHDL和DSL的相似度并不高,只是凑巧罢了。
Penhu同学在看到DSL后,灵感一现写出了Kubla语言的SPFA。一点很贱的是,Kubla内置的算法库里内置SPFA方法。不过,还是挺王道的,到头下来程序只有6行。分号后面是单行注释,叹号中间是多行注释。
! SPFA, in kubla language.
Kubia, next generation language designed by Penhu201.
SPFA, a alg to solve SSSP problem. !
(alg) ;包含一个库:alg(常见的算法)
|\n/| ;输入n
|\|\graph/|/| ;两个输入符号,代表输入二维数组graph
d[n] <- alg`SPFA . graph . 1 . i, 2 -- n
;调用alg库的SPFA方法,传三个参数,句号作为间隔。返回值赋给d数组。
i, 1 -- n : 1 ;循环,从1到n,循环变量为i,间隔1
|/"To $i: $d[i]"\| ;输出
-- SPFA, in DSL(Damn simple language).
-- DSL, a missing programming language designed by Xhacker Liu.
-- SPFA, a alg to solve SSSP problem.
inc io, ds
io.fopen("Graph.in") -> fin
io.input(fin, "%d") -> nodes
ds.graph.matrix.input(fin) -> graph
d[1, 2 to 10] <- 0, INFINITY
ds.queue.init() -> queue
ds.queue.in(queue, 1)
while ~ds.queue.empty(queue)
n <- ds.queue.out(queue)
loop i; 1 to nodes; 1
if d[n] + graph[n][i] < d[i]
d[n] + graph[n][i] -> d[i]
ds.queue.in(queue, i)
loop i; 2 to nodes; 1
io.output(stdout, "To $i: $d[i]")
备注:以上染色仅供参考。Kubla是用C的语法染的色,DSL使用VHDL。
今天,初赛的成绩出来了,我们参加的18个人过去了17个(其中8人参加集训、未参加集训的有3个高三)。只有黄轶唯悲情了。于是,明天开始,集训将减少为7人。
还有20多天(已经不是一个月了),我的终极目标是350/400,如今已经安全地迈过了第一道坎。
昨晚参加了Curimit神牛的模拟赛(难度“略”高于NOIP)。刚开始一看,先被吓到了。后来做着做着觉着还可以,最后竟然做出来3道。于是昨晚自我感觉良好。今天上午一看,我一下蒙了,只有可怜的30/400。一道题得了10分,另一道20。
USACO的题倒是刷的挺顺利,现在已经2.3了。
黄轶唯走了,倒也清静了。机房将不再是游戏厅,CS、韦诺、视频将会消失。
再见,黄轶唯。
初赛的成绩一直还没有下来,不过我的58分没问题。
这几天一直在刷USACO的题,现在一直在第一章徘徊。虽然说第一章真的很水,不过要把程序写出来,也没有那么简单。我曾经写出过极其恶心的代码,比如(你得拖底下的滚动条看):
...
for(m[1] = 0; m[1] <= 3; m[1]++)
{
for(m[2] = 0; m[2] <= 3; m[2]++)
{
for(m[3] = 0; m[3] <= 3; m[3]++)
{
for(m[4] = 0; m[4] <= 3; m[4]++)
{
for(m[5] = 0; m[5] <= 3; m[5]++)
{
for(m[6] = 0; m[6] <= 3; m[6]++)
{
for(m[7] = 0; m[7] <= 3; m[7]++)
{
for(m[8] = 0; m[8] <= 3; m[8]++)
{
for(m[9] = 0; m[9] <= 3; m[9]++)
{
if(is_finish(cur_clocks))
{
cur_len = 0;
for(i = 1; i <= 9; i++)
cur_len += m[i];
if(cur_len == shortest_len)
{
count++;
j = 0;
for(i = 1; i <= 9; i++)
{
if(m[i] > 0)
{
for(k = 1; k <= m[i]; k++)
{
j++;
moves[count][j] = i;
}
}
}
}
else if(cur_len < shortest_len)
{
count = 1;
shortest_len = cur_len;
j = 0;
for(i = 1; i <= 9; i++)
{
if(m[i] > 0)
{
for(k = 1; k <= m[i]; k++)
{
j++;
moves[count][j] = i;
}
}
}
}
}
move(cur_clocks, 9);
}
move(cur_clocks, 8);
}
move(cur_clocks, 7);
}
move(cur_clocks, 6);
}
move(cur_clocks, 5);
}
move(cur_clocks, 4);
}
move(cur_clocks, 3);
}
move(cur_clocks, 2);
}
move(cur_clocks, 1);
}
...
这实在是太糙了……不过USACO数据弱,竟然过了。于是安慰自己,这种题谈不上什么高级的算法,暴力搜索就好,K.I.S.S.嘛,好吧。至少针对水题,用点水方法也不是不行。
Wave已经用上了,可是,没有人跟我一块Wave……于是什么也感受不出来。更杯具的是,咱现在还没法发邀请。嗯,那就先放放吧,等以后大家都用上应该就能感受到威力了。
今天打开Synaptic,瞎翻,发现GNOME Shell就在源里。一阵欣喜,然后安装。现在正在体验,感觉不错,稳定性也挺好。只是因为是早期版本,好多功能还有待完善。但这种形式我个人认为还是不错的。
这几天USACO保持一天一个Section的进度,后天就能昂首挺进第二章了。
水果新出了鼠标,如果未来相关的Linux驱动完善的话,可考虑入手一。
昨天的初赛弄得我十分不爽。一些很烧饼的题做糙了。一考完,我们几个就悲情地在初中楼2层的楼道电脑敲程序,果然残了。杨进基正在上面吼。几个人对了一下答案,我和胡颖健差不多悲情,而黄轶唯则是已经释然了,他后60分得了两分。后来,我们借C(S)消愁。再后来,借C(语言)消愁愁更愁。
于是昨天整下午+晚上十分不爽。网上找了一份标准答案,看了看,得55分。杯具了。昨晚一个人寂寞地在宿舍,把Geany翻完了,今天给作者发过去。另外,Ubuntu上放Keynote导出的QuickTime文件有戏了。今天Gnome-Mplayer的作者管我要一个文件,他想试试。嗯,挺好。
今天,得到可靠消息,20多分就能过初赛。转悲为喜。
于是,我将继续一个月的战斗,为…(你猜?)而战斗。
虽然还有一些时间,但我已经迫不及待上考场了。初赛说起来就是这么简单。但,往往简单的东西也是致命的。初赛,只能过,不能被虐。没有退路。
所以,再看看往年的题,再看看基本的算法,各种排序、各种查找、各种各种。明天秒初赛。
在N天的集训后,终于回家了,躺在床上听last.fm,真爽。过了初赛后,准备淘个耳机。
今天发现GNOME里面有一个叫做Hamster的好东西,应该说很适合我。它的中文名叫“时间追踪器”,可以追踪你每一分钟在做什么,玩游戏花了多少时间等等。(当然它不是自动的,需要你手工输入)这样,每天晚上我可以清晰地盘点一下一天都干了什么。

今天看了些初赛题,还看了看KMP算法。说起KMP,就不得不提到Knuth这个我十分钦佩的人。今天就不说他了,以后有时间再说。KMP算法略难理解,于是今天下午我在机房给大家讲。说老实话,这个要讲出来确实不好讲,于是,我几乎是:“这个……恩,好像是这样的……哦,对不起,刚才说错了……”本来就麻烦的东西被我这么一折腾,大家都糊涂了。在此,我诚恳地向大家道歉。不过索性最后还是让大多数人明白了。为了某些管我要程序的人,我也贴贴代码。
#include <stdio.h>
#define MAX_STR_LEN 101
#define MAX_PATTERN_LEN 51
char str[MAX_STR_LEN];
char pattern[MAX_PATTERN_LEN];
int next[MAX_PATTERN_LEN];
void genNext();
int findPos();
int main()
{
char ch;
/* 输入主串和待匹配字符串 */
printf("Enter string: ");
str[0] = 0; /* str[0]存储字符串长度 */
while((ch = getchar()) != '\n')
{
str[0]++;
str[str[0]] = ch;
}
printf("Enter pattern: ");
pattern[0] = 0; /* pattern[0]存储字符串长度 */
while((ch = getchar()) != '\n')
{
pattern[0]++;
pattern[pattern[0]] = ch;
}
genNext(); /* 生成待匹配字符串的next数组 */
int pos;
pos = findPos(); /* 开始匹配 */
if(pos == 0)
printf("Substr not found.\n"); /* 未找到 */
else
printf("Position: %d\n", pos);
return 0;
}
void genNext()
{
int i = 1, j = 0;
next[1] = next[0] = 0;
while(i < pattern[0])
{
if(j == 0 || pattern[i] == pattern[j]) {
i++; j++; next[i] = j; }
else
j = next[j];
}
}
int findPos()
{
int i = 1, j = 1;
while(i <= str[0] && j <= pattern[0])
{
if(j == 0 || str[i] == pattern[j]) {
i++; j++; }
else
j = next[j];
}
if(j > pattern[0])
return i - pattern[0];
else
return 0;
}
今天Blog的评论达到100条(不含Spam),我决定开瓶鲜橙多庆祝一下。在此感谢所有支持我的Blog的人。
另:最近玩 Gnome方块 有点上瘾,得适可而止。/* 里面有一个阴冷的Bastard Mode,害死我了 */
初赛就要到来了,尚余2.5天准备时间。明天+后天+1/2大后天。周五下午和周六上午终于可以回家了,休息休息。紧接着就是下午的初赛,时间是两个小时,地点就在咱学校。
初赛的满分是100分,我做了前几年的,基本能拿70-75分。看了看各省的分数线,基本在60-65。所以,这两天半再好好看看,初赛还是可以轻松秒掉的。
给大家分享一道2006年初赛题(不定项选择题):
20. 在下列关于青少年信息学竞赛的说法中,你赞成的是()
A. 举行信息学竞赛的目的,是为了带动广大青少年学科学、爱科学,为造就一大批优秀的计算机科学 与技术人才奠定良好的基础
B. 如果竞赛优胜者不能直接保送上大学,我今后就不再参与这项活动了
C. 准备竞赛无非要靠题海战术,为了取得好成绩,就得拼时间、拼体力
D. 为了取得好成绩,不光要看智力因素,还要看非智力因素。优秀选手应该有坚韧不拔的意志,有 严谨求实的作风,既要努力奋进,又要胜不骄败不馁
这道题的参考答案处赫然写着:本题不回答为0分,答题一律满分。
初赛目前对我来说最头疼的是问题求解,一共两题,占10分。所以我得考虑这两道题都做不对的情况,毕竟人的人品有时是难以预料的。
今天已是集训第三天。周六就是初赛了,就在学校考。
初赛都是一些令人泄气却又不得不重视的题。有一些是计算机知识,能扯到Linux,能扯到图灵,还能扯到CPU。总之就是跟会考那些题类似——只是不能像会考那样背答案。第二种是一些奇怪的程序,让你看看输出是啥玩意。个人强烈建议使用搞怪C语言大赛的获奖作品。还有就是补充程序,这个难度稍微大一点。
2.5/8啥意思?准备初赛的时间一共8天,已过两天半。虽说初赛很简单,但如果到时候拉稀下软蛋就麻烦了,所以这六天还是不能松懈。
我发现不松懈的最好办法就是装Ubuntu。我一贯是比较爱玩的,但在班上似乎较为用功。
“切盘CS,2v2,柳,就差你了!”
“不玩不玩!没有!”
明白了吧。所以我发现我装Ubuntu虽然花了点时间,可却是明智的。另外心情会好不少。Windows在这个本本上表现太差了,亮度没法调、无线网不支持WPA2;而Ubuntu只需按几个键装上盘里带的闭源网卡驱动就万事大吉。
昨晚魏运华打来电话,先骂我一顿——前天我10:45才回的宿舍。然后还是对我进行了鼓励。昨天上午魏运华要加我飞信,把我冷到了……这两天一直穿着Google的Tee,感觉不错,感谢谷奥。开复的书周末看了一点,现在也没空看了,现在连周末都没有了。今天是Wpliu的生日,都没法回家陪他。
44天的竞赛课如今已过去1.5/44。
昨天每人发了一个hp的小本,挺好的,主要是比较轻,同时电池相当够用。这台笔记本将携Karmic+Geany+Cobalt配色+DejaVu Sans Mono陪我走过这四十多天。说起来也真惭愧,我至今不会用Vim/Emacs,还是爱用Gedit或者Geany。
比较悲剧的一件事情就是以后没有周末了,每天上午8:00到晚上10:00。
今天上午写了几个高精度的程序,其实说起来确实挺简单的。
“嗯?CS怎么变成熊猫了?”,这两天最有意思的事情就是昨天hyw的电脑中了熊猫烧香,这个古老有可爱有神奇的小病毒。
另外发现一个很好的软件,叫做iptux,完全兼容飞鸽传书。
这两天Blog上的Spam爆多。多亏了Akismet。
本来是十天的……因为可恶的HxNx流感变成5天了。这样就少讲了许多东西。不过,讲的东西也还是不少的。栈和队列、树、二叉树、图等等。第一次系统地学数据结构,还是相当过瘾的。我也接触到一些以前闻所未闻的东西,有时候也会突然“啊哈,灵机一动”,这种感觉很棒。
接下来还有10月份的集训,那是就是真正的备战了。现在看看往年复赛的题,确实挺难的。是一个挑战。不过,我从来都喜欢挑战。如果结果是成功,那么就十分爽;结果是失败,并不会损失什么。况且,既然那么多人对我抱有希望(……),说明至少我的机会还是很大的。
6日到10日,由于没有信竞的课,我可以自己做做题了。顺便把机器人的进度再往前赶一赶。最近时间真是紧张,以至于我每天晚上都是方便面,每天一个味,现在已经换了一种牌子了。时间的宝贵也让我越发感到Centro的重要性,它就像我的助手,每天告诉我该做什么,并安排好时间。
PS:离Schumi复出只有15天多了。关注中。我要向舒米学习,挑战自己。最后再祝舒米复出后勇夺分站赛冠军!