換句話說,沒移動的瓶子越多,移動的瓶子就會越少。
排列組合共有6種情況:3 * 2 * 1。
分別計算每一種情況下,沒移動的瓶子數。
找到最大數之後,與總瓶數相減,即為最少移動瓶子數。
想說不要直接算移動瓶子數應該會比較快,有嗎?
我也不知道……
code可讀性應該很差……
保險一點用unsigned int才不會overload,
但既然AC就懶得改了。 -_-
/* ACM 102 * mythnc * 2011/10/14 19:22:33 * run time: 0.028 */ #include <stdio.h> #define MAXARY 6 /* six permutations */ #define BIN 3 int findmax(int *); void output(int *); int main(void) { int b, c, g, i; /* cmp counts bottles which don't have to move */ /* each element to a permutation */ int cmp[MAXARY]; i = 0; while (scanf("%d %d %d", &b, &g, &c) == 3) { switch (i++) { case 0: cmp[0] = cmp[1] = b; cmp[2] = cmp[3] = c; cmp[4] = cmp[5] = g; break; case 1: cmp[0] += c; cmp[1] += g; cmp[2] += b; cmp[3] += g; cmp[4] += b; cmp[5] += c; break; case 2: cmp[0] += g; cmp[1] += c; cmp[2] += g; cmp[3] += b; cmp[4] += c; cmp[5] += b; /* sum of element 0, 3, 4 is the total bottles */ output(cmp); i = 0; } } return 0; } /* findmax: find the max element of s */ int findmax(int *s) { int i, max; for (max = i = 0; i < MAXARY; i++) if (s[i] > s[max]) max = i; return max; } /* output: output result */ void output(int *s) { switch(findmax(s)) { case 0: printf("BCG %d\n", s[3]+s[4]); break; case 1: printf("BGC %d\n", s[2]+s[5]); break; case 2: printf("CBG %d\n", s[1]+s[5]); break; case 3: printf("CGB %d\n", s[0]+s[4]); break; case 4: printf("GBC %d\n", s[0]+s[3]); break; case 5: printf("GCB %d\n", s[1]+s[2]); } }
沒有留言:
張貼留言