
2006年8月4日
拿了一个“Best Coding”单项奖,出乎我们的意料,本来以为能在另外两个单项奖上有所作为的。
我们的软件实际测试环节排名是第三,但由于其他的分数低了一些,比如团队合作、计划实施等表面上的东西丢了一些分,所以最后的总排名是第四。
团队合作、计划实施等这些表面上的东西不是不重要,我们也是有的,只是没有通过某种方式变现出来,所以评委也没法评估好坏了。
整个比赛还是非常有收获的,基本上见识了一个软件开发的大致流程及其复杂性。趋势这个公司给我的印象也非常不错,很有朝气,比赛组织得也是井井有条,很多方面都考虑得比较周到。
但在比赛组织方面还是有一些可以改进的地方,比如“不能上网”这个限制条件,赛后我和队友开玩笑说:如果能用1小时google,也许我们能拿个第一:P。
这当然不是胡说的,赛题主要是关于网络安全方面,我们都是非计算机专业的,看计算机专业的普通词汇还行,但是网络安全的专业词汇就不行了,以至于我们到最后才把题目的一个关键问题搞清楚(当时已经来不及作修改了)。
另外我们的一个队员一直在钻研一个关键问题,但是到最后没有形成完成的解决方案,其中一个checksum算法就把我们卡住了半天,书上没有详细的资料,我们竟然自己在那里反演这个算法!!
这当然也说明了我们的基本功还是不扎实。我觉得这些基本的东西能用就行了,谁能全部记住啊,关键是要有敏锐的思维和超强的学习能力。
四天的比赛还有许多见闻,许多感想,就不一一道来了,总之要真想在软件这一行干下去的话,要学的,要实践的,还有许多,现在还差得太远,但愿还有机会:)
相关报道见:http://sd.csdn.net/subject/trendmicro/
Ecogiser's Blog
posted @
2006-08-04 09:55 Binary Race 阅读(89) |
评论 (1) |
编辑

2006年7月2日
参加2006年的Imagine cup的预选赛时,时间已经不多了,第一轮结束就不能再登陆Herbert了,非常遗憾没有解决掉所有的关,不过当时留了个心眼,把Herbert登陆时与服务器通讯的原始tcp包抓了下来,一直想分析一下,然后让herbert直接读取包中的内容来启动。花了三天时间,终于整完了:Herbert
我破解完的Herbert有几个小bug:
1. 每个小关我以前写的解决方案都在,但是换行符变成了“..”,得把..去掉并回车才能运行。
2. 每个小关机器人的初始位置不对,必须按一下开始(Ctrl+G)才能显示正确的位置。
3. 暂时不能保存写的解决方案。
4. 计分好像有差错。
破解过程:
1. 分析tcp包,过滤掉无用的,错误的包,把错位的包根据seq、ack和len码排好顺序。
2. 提取出Data,发现是个xml。
3. 原先Herbert通过webservices获得一个dataset,现在“override”这个过程,直接从xml得到dataset。
想法:
1. 做成web版本的,加上AJAX,注册了以后直接在网页上玩,然后来个积分榜……,注册用户还可以自己建关让大家玩
Note:
1. 用户密码随意。
2. Dotnet framework1.1
3. 玩的时候把下方的speed调到最高比较舒服,要不然Herbert走得太慢。
4. 开始的loadingdata过程较长,是正常的。
5. 一定要注意herbert的初始位置可能不对,按一下开始(Ctrl+G)才能显示正确的位置。
第一关的解决方案是:
a(A):rArAa(Ass)
a()
>>
Herbert 玩法:
官方规则(英语),翻译了几条主要部分:
1. 使用h语言对机器人进行编程
2. 目标是机器人按到所有的“button”(白色),并且需要避让开灰色的“button”和“wall”
3. 按到灰色按钮将重置所有已经被按到的白色按钮,“wall”将阻挡机器人的前进。
4. h语言:
a) 有着一般高级语言的元素:statements, procedures, parameters, arguments, and recursion
b) h语言的指令只有三个:s(前进一步), r (右转), l (左转)。
c) 过程的定义:x[(P1,P2,...,Pk)]:y1y2y3...yn ,x 是除了s,r,l的任何小写字母, Pi 是参数, yi 是任何指令, 0 <=k <=15, and n >= 0. If k = 0 说明该过程没有参数。
d) 参数可以是数字,也可以是指令组合
e) 多说也说不清楚,看几个例子,可以在Herbert客户端的level0里面练习练习:
i. a(a):sa(A-1)
a
ii. b:sssrb
b
iii. a:ssssra
sssa
iv. a(A,B):f(B)ra(A-1,B)
f(A):sf(A-1)
a(4,5)
v. a(A,B,C):f(B)Ca(A-1,B,C)
f(A):sf(A-1)
a(4,5,r)
f) 每个字母和数字算1个byte,符号不算
5. 计分规则:
设:
Points:根据难度设置的关卡分值
TotalButtons :每关的白色按钮
Buttons:按到的白色按钮
MaxBytes :每关的最大允许bytes
Bytes :实际使用的bytes
a) If Buttons = TotalButtons and Bytes <= MaxBytes
score = (Points*MaxBytes)/Bytes.
b) If Buttons < TotalButtons or Bytes > MaxBytes, you have not solved the level. Score = Buttons*PointsPerButton
PointsPerButton is determined as follows:
i. If Bytes <= MaxBytes, PointsPerButton = (Points/(2*TotalButtons)).
ii. If MaxBytes < Bytes <= 2*MaxBytes, PointsPerButton = (Points*(2*MaxBytes -Bytes)/(2*MaxBytes*TotalButtons)).
iii. If 2*MaxBytes < Bytes, PointsPerButton = 0
Ecogiser's Blog
posted @
2006-07-02 11:29 Binary Race 阅读(598) |
评论 (5) |
编辑

2006年6月23日
周二,颈椎又开始抗议了,不是简单的肩膀疼,而是头疼,看来又得好好休息几天了。
刚好,mm的mm中考,她妈又刚好出差,我就和mm回来给她做饭了。
这几天的菜谱真的很不错啊,估计能长上几斤了:)
星期三:咖喱鸡,咖喱放的稍微有些少,没有上次有味,但是整体还是很不错的。
星期四:红烧肉,第一次做红烧肉,非常不错,一餐就吃光了,就是肥肉和肉皮稍微有些少了。
星期五:牛肉炖胡萝卜+番茄。前些天作了几次牛肉炖番茄,这次看来,番茄只要放两个,有酸味就可以了,其余的配料是次要的,主要为了添饱肚子。ps:牛肉番茄汤加一些面包屑就是大名鼎鼎的罗宋汤了。
这些都是我mm主勺,可不是我不想做菜,我抢不过她,哈哈,她的兴致太高了,我只能打打下手了,不过明天的鲫鱼汤和后天的可乐鸡可是我的拿手好菜,她就得打下手了,呵呵。
我很奇怪,每次同学或朋友问到我是南方人,就是南方人好啊,南方人会做饭啊,似乎有些歧视会做饭的男人似的。
不过还好,我不做饭,我只做拿手菜。
Ecogiser's Blog
posted @
2006-06-23 22:14 Binary Race 阅读(134) |
评论 (0) |
编辑

2006年6月15日
Problem
Statement
这个问题需要求解在一个城市网中,连接所有城市的最小代价,一个典型的最小生成树问题。
需要注意的是,每个城市只能朝一个方向修路,所以两个城市之间的最小代价不是(X+Y)/2,而是Max(X,)
解决方案如下:
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
//最小生成树问题
public class CityLink
{
int N;
bool[,]
map;
bool[]
visited;
bool AllConnect()
{
visited = new bool[N];//very
importent!!!!
dfs(0);
for (int i = 0;
i < N; i++)
if (!visited[i])
return false;
return true;
}
void dfs(int i)
{
visited[i] = true;
for (int j = 0;
j < N; j++)
if (map[i, j] && !visited[j])
dfs(j);
}
public int timeTaken(int[]
x, int[]
y)
{
N = x.Length;
int[,] d = new int[N,
N];
map = new bool[N,
N];
List<int>
edgesv = new List<int>();//所有不同长度的边
Hashtable edges = new Hashtable();//每个边都连接了哪些顶点
for (int i = 0;
i != N;
i++)
for (int j = i;
j != N;
j++)
{
if (x[i] == x[j])
d[i, j] = (Math.Abs(y[i] - y[j]) + 1) / 2;
else if (y[i]
== y[j])
d[i, j] = (Math.Abs(x[i] - x[j]) + 1) / 2;
//只能朝一个方向走,不能改变方向?
else
d[i, j] = Math.Max(Math.Abs(x[i] - x[j]),
Math.Abs(y[i] - y[j]));
//d[i, j] = (Math.Abs(x[i] - x[j]) + Math.Abs(y[i] - y[j]) + 1) / 2;
if (!edgesv.Contains(d[i, j]))
edgesv.Add(d[i, j]);
if (edges.Contains(d[i, j]))
{
((List<int>)edges[d[i,
j]]).Add(i);
((List<int>)edges[d[i,
j]]).Add(j);
}
else
{
List<int>
tmp = new List<int>();
tmp.Add(i);
tmp.Add(j);
edges.Add(d[i, j], tmp);
}
}
edgesv.Sort();//Kruskal算法需要从最小的边开始,所以这里排序一下
//Kruskal
for (int i = 0;
i < edgesv.Count; i++)
{
//Conect two points
List<int>
points = (List<int>)edges[edgesv[i]];
for (int j = 0;
j < points.Count; j += 2)
{
map[points[j], points[j + 1]] = true;
map[points[j+1], points[j]] = true;
}
if (AllConnect())
return edgesv[i];
}
return -1;
}
>
Ecogiser's Blog
posted @
2006-06-15 16:31 Binary Race 阅读(251) |
评论 (0) |
编辑

2006年6月8日
http://www.topcoder.com/tc?module=MatchDetails&rd=9986
好久没有做题了,不是时间不好,就是有事不在。。。
//太郁闷了,居然一道题都没有做出来,最后发现45%的人都是0分,还有一些欣慰
以下分析了petr大牛的解决方案,他居然在23分钟把三个题做完了!!!
1:BifidSortMachine
Problem
Statement
Solution:
using System;
using System.Collections.Generic;
using System.Text;
namespace googlecodejam
{
public class BifidSortMachine
{
public int countMoves(int[]
a)
{
int[]
b = (int[])a.Clone();
Array.Sort(b);
Dictionary<int, int>
d = new Dictionary<int, int>();
for (int i = 0;
i < b.Length; ++i)
d[b[i]] = i;//各个元素在第几个
for (int i = 0;
i < a.Length; ++i)
a[i] = d[a[i]];
int[]
mx = new int[a.Length];
int r = 0;
for (int i = 0;
i < a.Length; ++i)
{
///求最大递增长度,这里的递增不一定连个数字连在一起,但是必须是只增加1的,
///比如:1,2,4,5,3的最大递增长度是3,因为1,2,...3是递增的
int m = 0;
for (int j = 0;
j < i; ++j)
if (a[j]
== a[i] - 1)
m = Math.Max(m,
mx[j]);
mx[i] = m + 1;
r = Math.Max(r,
mx[i]);
}
return a.Length - r;
}
}
}
2.LightSwitches
Problem
Statement
Solution:
using System;
namespace googlecodejam
{
public class LightSwitches
{
public long countPossibleConfigurations(string[]
switches)
{
int n = switches.Length;
int m = switches[0].Length;
bool[,]
a = new bool[n,
m];
for (int i = 0;
i < n; ++i)
for (int j = 0;
j < m; ++j)
a[i, j] = switches[i][j]
== 'Y';
bool[]
used = new bool[n];
long res = 1;
for (int i = 0;
i < m; ++i)
{
for (int j = 0;
j < n; ++j)
if (!used[j]
&& a[j, i])//如果switch没有use,并且这里有Y
{
used[j] = true;
for (int k = 0;
k < n; ++k)
if (a[k,
i] && k != j)//其他行的这一列也有Y
for (int l = 0;
l < m; ++l)
a[k, l] ^= a[j,
l];//把那一行的所有元素
^= 本行的所有元素
res <<= 1;
break;
}
}
return res;
}
}
}
3.TourCounting
这个题是图论相关的,没有学过,代码都看不懂!_Q,等学会了再来分析好了。。。
>
Ecogiser's Blog
posted @
2006-06-08 15:12 Binary Race 阅读(57) |
评论 (0) |
编辑