随笔-14  评论-8  文章-0  trackbacks-0
  2006年6月8日
http://min-qin.blogspot.com
posted @ 2007-05-01 09:49 Binary Race 阅读(39) | 评论 (0)编辑

拿了一个“Best Coding”单项奖,出乎我们的意料,本来以为能在另外两个单项奖上有所作为的。
我们的软件实际测试环节排名是第三,但由于其他的分数低了一些,比如团队合作、计划实施等表面上的东西丢了一些分,所以最后的总排名是第四。
团队合作、计划实施等这些表面上的东西不是不重要,我们也是有的,只是没有通过某种方式变现出来,所以评委也没法评估好坏了。

整个比赛还是非常有收获的,基本上见识了一个软件开发的大致流程及其复杂性。趋势这个公司给我的印象也非常不错,很有朝气,比赛组织得也是井井有条,很多方面都考虑得比较周到。
但在比赛组织方面还是有一些可以改进的地方,比如“不能上网”这个限制条件,赛后我和队友开玩笑说:如果能用1小时google,也许我们能拿个第一:P。

这当然不是胡说的,赛题主要是关于网络安全方面,我们都是非计算机专业的,看计算机专业的普通词汇还行,但是网络安全的专业词汇就不行了,以至于我们到最后才把题目的一个关键问题搞清楚(当时已经来不及作修改了)。
另外我们的一个队员一直在钻研一个关键问题,但是到最后没有形成完成的解决方案,其中一个checksum算法就把我们卡住了半天,书上没有详细的资料,我们竟然自己在那里反演这个算法!!

这当然也说明了我们的基本功还是不扎实。我觉得这些基本的东西能用就行了,谁能全部记住啊,关键是要有敏锐的思维和超强的学习能力。

四天的比赛还有许多见闻,许多感想,就不一一道来了,总之要真想在软件这一行干下去的话,要学的,要实践的,还有许多,现在还差得太远,但愿还有机会:)

相关报道见:http://sd.csdn.net/subject/trendmicro/



Ecogiser's Blog
posted @ 2006-08-04 09:55 Binary Race 阅读(90) | 评论 (1)编辑

参加2006年的Imagine cup的预选赛时,时间已经不多了,第一轮结束就不能再登陆Herbert了,非常遗憾没有解决掉所有的关,不过当时留了个心眼,把Herbert登陆时与服务器通讯的原始tcp包抓了下来,一直想分析一下,然后让herbert直接读取包中的内容来启动。花了三天时间,终于整完了:Herbert

我破解完的Herbert有几个小bug

1.  每个小关我以前写的解决方案都在,但是换行符变成了“..”,得把..去掉并回车才能运行。

2.  每个小关机器人的初始位置不对,必须按一下开始(Ctrl+G)才能显示正确的位置。

3.  暂时不能保存写的解决方案。

4.  计分好像有差错。

 

破解过程:

1.  分析tcp包,过滤掉无用的,错误的包,把错位的包根据seqacklen码排好顺序。

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 是除了srl的任何小写字母, 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)        每个字母和数字算1byte,符号不算

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 阅读(602) | 评论 (5)编辑

周二,颈椎又开始抗议了,不是简单的肩膀疼,而是头疼,看来又得好好休息几天了。
刚好,mm的mm中考,她妈又刚好出差,我就和mm回来给她做饭了。
这几天的菜谱真的很不错啊,估计能长上几斤了:)

星期三:咖喱鸡,咖喱放的稍微有些少,没有上次有味,但是整体还是很不错的。
星期四:红烧肉,第一次做红烧肉,非常不错,一餐就吃光了,就是肥肉和肉皮稍微有些少了。
星期五:牛肉炖胡萝卜+番茄。前些天作了几次牛肉炖番茄,这次看来,番茄只要放两个,有酸味就可以了,其余的配料是次要的,主要为了添饱肚子。ps:牛肉番茄汤加一些面包屑就是大名鼎鼎的罗宋汤了。

这些都是我mm主勺,可不是我不想做菜,我抢不过她,哈哈,她的兴致太高了,我只能打打下手了,不过明天的鲫鱼汤和后天的可乐鸡可是我的拿手好菜,她就得打下手了,呵呵。

我很奇怪,每次同学或朋友问到我是南方人,就是南方人好啊,南方人会做饭啊,似乎有些歧视会做饭的男人似的。
不过还好,我不做饭,我只做拿手菜。



Ecogiser's Blog
posted @ 2006-06-23 22:14 Binary Race 阅读(137) | 评论 (0)编辑

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 阅读(294) | 评论 (0)编辑


Ecogiser's Blog
posted @ 2006-06-09 12:52 Binary Race 阅读(58) | 评论 (2)编辑

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 阅读(63) | 评论 (0)编辑