2011年7月24日 星期日

c081: Ecological Bin Packing

內容 :
    有3個桶子用來裝回收的玻璃瓶,玻璃瓶的顏色有三種:棕色(Brown)、綠色(Green)、透明色(Clear)。在這個問題裡我們會告訴你每個桶子 裏的玻璃瓶的顏色及數量,現在要搬移桶子裏的玻璃瓶使得最後每個桶子裡都只有單一顏色的玻璃瓶,以方便回收。你的任務就是要算出最小搬移的瓶子數。你可以 假設每個桶子的容量無限大,並且總共搬移的瓶子數不會超過231。

輸入說明 :
    每筆測試資料一行,每行有9個整數.前3個代表第1個桶子裡Brown, Green, Clear顏色的瓶子數。接下來的3個數代表 第2個桶子裡Brown, Green, Clear顏色的瓶子數。最後的3個數代表第3個桶子裡Brown, Green, Clear顏色的瓶子數。

    例如:10 15 20 30 12 8 15 8 31

    表示有20個Clear色的玻璃瓶在第1個桶子裏,12個Green色的玻璃瓶在第2個桶子裏,15個Brown色的玻璃瓶在第3個桶子裏。

輸出說明 :
    對每一筆測試資料,輸出3個桶子內最後存放之玻璃瓶顏色,以及最小搬移的瓶子數。請以大寫的'G'、 'B'、 'C' 分別代表綠色(Green)、棕色(Brown)、透明色(Clear)。

    例如:BCG 30

    代表最後搬移的結果第1個桶子內的玻璃瓶顏色為Brown,第2個桶子內的玻璃瓶顏色為Clear,第3個桶子內的玻璃瓶顏色為Green.並且總共搬移了30個玻璃瓶。
如果最小搬移瓶子數有一組以上的組合,請輸出字典順序最小的那一組答案。

範例輸入 :
1 2 3 4 5 6 7 8 9
5 10 5 20 10 5 10 20 10

範例輸出 :
BCG 30
CBG 50

出處 :
    ACM 102

程式碼1 :
#include<stdio.h>

int main()
{
    int i,j,k,jj,kk,in[9],temp,r[3],max,total;

    while(scanf("%d",&in[0])==1)
    {
        total = in[0];
        for(i=1; i<9; i++)
        {
            scanf("%d",&in[i]);
            total = total + in[i];
        }
        for(i=0; i<7; i=i+3)
        {
            temp = in[i+1];
            in[i+1] = in[i+2];
            in[i+2] = temp;
        }
        r[0] = 0;
        r[1] = 1;
        r[2] = 2;
        max = in[0] + in[4] + in[8];
        
        for(i=0; i<3; i++)
            for(j=0; j<3; j++)
                for(k=0; k<3; k++)
                    if(i!=j && j!=k && i!=k)
                    {
                        jj = 3 + j;
                        kk = 6 + k;
                        if(max < (temp=(in[i]+in[jj]+in[kk])))
                        {
                            max = temp;
                            r[0] = i;
                            r[1] = j;
                            r[2] = k;
                        }
                    }
        for(i=0; i<3; i++)
            switch(r[i])
            {
                case 0:
                    printf("B");
                    break;
                case 1:
                    printf("C");
                    break;
                case 2:
                    printf("G");
                    break;
            }
            
        printf(" %d\n",total - max);
    }        
    return 0;
}

程式碼2 :
#include<stdio.h>

int main()
{
    int i,in[9],temp[6],max,total,choose;
    
    while(scanf("%d",&in[0])==1)
    {
        total = in[0];
        for(i=1; i<9; i++)
        {
            scanf("%d",&in[i]);
            total = total + in[i];
        }
        
        temp[0] = in[0] + in[5] + in[7];
        temp[1] = in[0] + in[4] + in[8];        
        temp[2] = in[2] + in[3] + in[7];
        temp[3] = in[2] + in[4] + in[6];        
        temp[4] = in[1] + in[3] + in[8];
        temp[5] = in[1] + in[5] + in[6];
                
        max = temp[0];
        choose = 0;
        for(i=1; i<6; i++)
            if(temp[i] > max)
            {
                max = temp[i];
                choose = i;
            }
        
        switch(choose)
        {
            case 0:
                printf("BCG %d\n",total-max);
                break;
            case 1:
                printf("BGC %d\n",total-max);
                break;
            case 2:
                printf("CBG %d\n",total-max);
                break;
            case 3:
                printf("CGB %d\n",total-max);
                break;
            case 4:
                printf("GBC %d\n",total-max);
                break;
            case 5:
                printf("GCB %d\n",total-max);
                break;
        }
    }        
    return 0;
}





http://zerojudge.tw/ShowProblem?problemid=c081

沒有留言:

張貼留言