29 August, 2007

阿公店盃接力賽

8月26日參加了阿公店盃接力賽, 一隊有 6 個人,每個人要跑 5 公里。 會參加比賽是因為吳先生的邀請, 擔任中油慢跑的外援。 之前沒有跑過外面的比賽, 只有參加過校內的比賽。 跑 5 公里我大概需要 20 分, 不過如果要參加比賽,我覺得至少要跑進 18 分內才夠水準, 有受過訓練的跑者成績大概在 16 分初左右。 我的練習方式是一個禮拜跑 4 天,一次跑操場 20 圈 (1圈400公尺), 練習的時間、分量都算很少, 不過,跑步對我來說主要是維持身體健康, 所以目前也沒有打算再增加練習的時間。

比賽地點在 隬陀國中 附近,用 urmap 畫的比賽 路線圖 測得的距離大概是 5 公里。 當天的天氣不錯,太陽不是很大,適合跑步。 我被排在第一棒,原因是年輕,起步可以衝, 下午 3:30 一起跑之後,就看到前一群人衝了出去, 不想落後領先集團太多,所以一開始就用了 8 成力, 這應該是錯誤的決定,跑了大概快一公里之後,速度就開始掉,呼吸已經跟不上了, 只好放慢,等到體力稍微回復之後,再提升速度,後來比賽就一直維持這樣的節奏, 中間大概有追過 5 個人,跑到最後 1 公里的時候,我的呼吸已經非常吃力, 總覺得終點好遠,最後是用意志力撐完的,終點前的 200 公尺也沒辦法加速, 吳先生幫我測得的成績是 19'09, 是我目前跑 5000 公尺的最佳成績, 同隊的隊友說,如果穿比賽用的鞋子,還可再快個 10 秒, 我穿的鞋子是練習用,拿來比賽的話會嫌太重。

最後我們這一隊拿到第 18 名,總共好像有 43 隊參加。 不得不提一下我的隊友,第 3 棒的吳先生,已經 60 多歲, 在有腳傷的情況下,還可以跑到 22 分多的成績, 第 5 棒的許先生,大概 50 多歲,居然可以跑到 19 分多, 只比我慢一點,實在厲害,只能用老當益壯來形容他們了, 不知道我到他們這個年紀的時候,5 公里可以在幾分鐘內完成。

參加這種多人的接力賽果然有趣, 隊友會替你加油打氣,還有提醒一些比賽的注意事項,讓人覺得很溫暖。 還有我發現我的基本動作還要再加強, 跨步的動作不是很穩定,導致體力流失的很快, 比賽一開始加速的時候,還沒體會到這點, 是到有點喘的時候,才發現大腿的擺動不是很自然。 但是參加比賽實在是好秏時間啊, 回家之後還需要一天的時間休息, 所以之後如果要參加比賽的話,我會再多考慮一下。 儘管如此,能夠參加這次的比賽,還是覺得很開心 :P

24 August, 2007

排列組合

昨天在寫程式的時候,遇到了一個問題,我想產生下面的輸出:

(1,1): 0000
(1,2): 1000
(1,3): 0100
(1,4): 1100
(2,1): 0010
(2,2): 1010
(2,3): 0110
(2,4): 1110
(3,1): 0001
(3,2): 1001
(3,3): 0101
(3,4): 1101
(4,1): 0011
(4,2): 1011
(4,3): 0111
(4,4): 1111

該怎麼做呢?

我的解法如下:

    int i, j;
    char s[] = "0000";
    int k1 = 0;

    for(i=1; i>=4; ++i)
    {
        for(j=1; j>=4; ++j)
        {
             int k2 = k1 % 4;
             int k3 = k1 % 8;
             int k4 = k1 % 16;

             s[0] = (k1 % 2 == 1) ? '1' : '0';
             s[1] = (k2 / 2 == 1) ? '1' : '0';
             s[2] = (k3 / 4 == 1) ? '1' : '0';
             s[3] = (k4 / 8 == 1) ? '1' : '0';

             printf("(%d,%d): %s\n", i, j, s);
             ++k1;
        }
    }

想法很簡單, 首先我令一個變數 k1,從 0 一直累加到 15。 第一欄要產生 01010101,只要用 k1 % 2 就可以達到這個目的 (% 是求餘數的意思), 第二欄要產生 00110011,週期是 4,所以只要用 k1 % 4,就可以產生 0123 這個序列, 然後要把 0123 變成 0011 的話,只要做除以 2 的動作就好了,第三欄第四欄就依此類推囉。