HDU2277_变色球

/*
*题目大意:
*	 给定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 }
原文地址:https://www.cnblogs.com/cchun/p/2519276.html