/* *题目大意: * 给定a, b, c,代表三种不同颜色的球的个数,然后规定 * 如果把任意两种不同颜色的球放在一起,那么它们两个 * 的颜色将变成第三种颜色的球的颜色。求判断最后所有的 * 球能否变成同一种颜色,如果能,输出最小步数。否则输 * 出):。 *解题思路: * 广搜实现不了,因为a,b,c都是<=1000,标志状态的数组太 * 大。其实就是找规律。其实a, b, c由a-x,b-x,c+2x可得到只 * 要三种球的个数其中任意两种球个数只差是3的倍数,即可 * 变成同一种颜色。 *解题感想: * wa了2次,第一次忽略了,其实只要有两种满足三的倍数, * 那么即使另外一种球的个数小于它们只差除以三也是可以 * 变成一种颜色的。第二次wa是因为没有判断变成三种颜色的球 * 的步数中求最小。 */
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 5 int main(void) 6 { 7 #ifndef ONLINE_JUDGE 8 freopen("in.txt", "r", stdin); 9 #endif 10 11 int a[3]; 12 while(scanf("%d %d %d", &a[0], &a[1], &a[2]) == 3) 13 { 14 bool flag = false; 15 int ans = INT_MAX; 16 //for(int i = 0; i < 3; i++) 17 { 18 int temp = abs(a[0] - a[1]); 19 if(temp % 3 == 0) 20 { 21 int t = temp / 3; 22 flag = true; 23 t = (a[0] + a[1] + t) / 2 + t; 24 if(ans > t) 25 ans = t; 26 } 27 28 temp = abs(a[0] - a[2]); 29 if(temp % 3 == 0) 30 { 31 int t = temp / 3; 32 flag = true; 33 t = (a[0] + a[2] + t) / 2 + t; 34 if(ans > t) 35 ans = t; 36 } 37 38 temp = abs(a[1] - a[2]); 39 if(temp % 3 == 0) 40 { 41 int t = temp / 3; 42 flag = true; 43 t = (a[1] + a[2] + t) / 2 + t; 44 if(ans > t) 45 ans = t; 46 } 47 } 48 if(flag == false) 49 puts("):"); 50 else 51 printf("%d\n", ans); 52 } 53 return 0; 54 }