查看: 2571|回復: 1
打印 上一主題 下一主題

[UVa] 102 - Ecological Bin Packing

[複製鏈接]
  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    跳轉到指定樓層
    樓主
    發表於 2014-4-18 22:02:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    原題:http://luckycat.kshs.kh.edu.tw/homework/q102.htm
    ACCODE : http://ideone.com/IVglPQ (BY Sylveon)

    這題老實說…

    我在挖出滿佈蜘蛛網的CODE後已經認不得它了|||

    大致的想法就是DFS吧

    因為是字母順序,就按字母順序遞迴吧

    遞迴存到最後也可以用字串輸出

    感覺上即使用DFS還是會有點小暴力

    可以先把第一組(BCG)的搬移數存起來

    比對搬移數,比較少時用新的疊掉

    應該還不太難,好久前寫的了,這次看是重新思考

    太久了,認不得它了,反正也不是個太好的方法

    很久前寫的CODE現在都會看不下去
    回復

    使用道具 檢舉

  • TA的每日心情
    鬱悶
    2015-2-10 21:23
  • 簽到天數: 1 天

    [LV.1]初來乍到

    12

    主題

    69

    帖子

    779

    積分

    高級會員

    Rank: 4

    積分
    779

    台南一中資訊社

    頭香
    發表於 2014-4-19 20:10:46 | 只看該作者
    本帖最後由 amoshuangyc 於 2014-4-28 22:09 編輯

    今天面試完心情不錯,看到這題心血來潮就寫了一下,嗯嗯,總是在畢業前對資訊社有了一點貢獻。
    順便試一下這裡的發文系統~~

    這題我是直接把所有可能都跑一遍,反正也才 6 個可能:
    "BCG", "BGC", "CBG", "CGB", "GBC", "GCB"。


    以 Sample Input: 5 10 5 20 10 5 10 20 10 為例,
    編號 Brown(B) Green(G) Clear(C)
    1 5 10 5
    2 20 10 5
    3 10 20 10

    我們嘗試計算組合 BGC 所需移動的步數:
    第一個桶子最終為 B,第二個為 G,第三個為 C,


    那我們需要做的是
    • 將第二個桶子的 B 和第三個桶子的 B 都移到第一個桶子。
    • 將第一個桶子的 G 和第三個桶子的 G 都移到第二個桶子。
    • 將第一個桶子的 C 和第二個桶子的 C 都移到第三個桶子。

    於是所需移動的步數為表格中的 (B2 + B3) + (G1 + G3) + (C1 + C2) = 75。

    當我們把各個組合都計算過後,我們就可以知道哪一個組合所需移動的步數最小。這題答案是 CBG 50。

    ※ 桶子的 index 轉為從 0 開始數


    #include <iostream>
    using namespace std;

    int calculate_steps(const int data[][3], const string combination) {
        int steps = 0;
       
        for (int i=0; i<3; i++) {
            if (combination == 'B')

                steps = steps + (data[(i+1)%3][0] + data[(i+2)%3][0]);
            else if (combination == 'G')

                steps = steps + (data[(i+1)%3][1] + data[(i+2)%3][1]);
            else    // combination = 'C'

                steps = steps + (data[(i+1)%3][2] + data[(i+2)%3][2]);
        }
       
        return steps;
    }

    int main() {
        const string combinations[6] = {"BCG", "BGC", "CBG", "CGB", "GBC", "GCB"};
        int data[3][3];    // [[B0, G0, C0], [B1, G1, C1], [B2, G2, C2]]
       
        while (cin >> data[0][0] >> data[0][1] >> data[0][2]
                    >> data[1][0] >> data[1][1] >> data[1][2]
                    >> data[2][0] >> data[2][1] >> data[2][2]) {
            
            int min_steps = calculate_steps(data, combinations[0]);
            int min_idx = 0;
            for (int i=1; i<6; i++)  {
                int steps = calculate_steps(data, combinations);

                if (steps < min_steps) {
                    min_steps = steps;
                    min_idx = i;
                }
            }
            
            cout << combinations[min_idx] << " " << min_steps << endl;
            
        }
       
        return 0;
    }



    評分

    參與人數 1金幣 +3 收起 理由
    Sylveon + 3 code很清楚

    查看全部評分

    回復 支持 反對

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表