Ecological Bin Packing

Description有3個桶子用來裝回收的玻璃瓶,玻璃瓶的顏色有三種:棕色(Brown)、綠色(Green)、透明色(Clear)。在這個問題裡我們會告訴你每個桶子裏的玻璃瓶的顏色及數量,現在要搬移桶子裏的玻璃瓶使得最後每個桶子裡都只有單一顏色的玻璃瓶,以方便回收。你的任務就是要算出最小搬移的瓶子數。你可以假設每個桶子的容量無限大,並且總共搬移的瓶子數不會超過231。
Input每筆測試資料一行,每行有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個桶子裏。
Output對每一筆測試資料,輸出3個桶子內最後存放之玻璃瓶顏色,以及最小搬移的瓶子數。請以大寫的'G'、 'B'、 'C' 分別代表綠色(Green)、棕色(Brown)、透明色(Clear)。 例如:BCG 30 代表最後搬移的結果第1個桶子內的玻璃瓶顏色為Brown,第2個桶子內的玻璃瓶顏色為Clear,第3個桶子內的玻璃瓶顏色為Green.並且總共搬移了30個玻璃瓶。 如果最小搬移瓶子數有一組以上的組合,請輸出字典順序最小的那一組答案。

Sample Input

1 2 3 4 5 6 7 8 9
5 10 5 20 10 5 10 20 10

Sample Output

BCG 30
CBG 50


#include<stdio.h>
#include<string.h>
void main()
{
int a[3][3],i,j,t,b[6]={0},k=0,d=0;
char c[6][4]={"BGC","BCG","GBC","GCB","CBG","CGB"},s[4];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
scanf("%d",&a[i][j]);
d=d+a[i][j];
}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
if(j==i)continue;
for(t=0;t<3;t++)
{
if(t==j||t==i)continue;
b[k]=d-a[0][i]-a[1][j]-a[2][t];
k++;
}
}
k=232;
for(i=0;i<6;i++)
{
if(b[i]==0)continue;
if(b[i]<k)k=b[i],strcpy(s,c[i]);
else if(b[i]==k&&strcmp(s,c[i])>0)strcpy(s,c[i]);

}
printf("%s %d\n",s,k);
}

posted @ 2013-06-23 16:16  失眠的娃儿  阅读(360)  评论(0编辑  收藏  举报