题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2277
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 694 Accepted Submission(s):
272
①有两个球的数量相等(或者是三个都相等)
②有一种球是另一种球数量的三倍(每改变一次,有一个球会增加2个,另两个会各减少1个,中间差了3,也就是说,只有是三的倍数的情况,三个球才能实现完全转化),这种条件就需要分情况了,因为可能是都转化为球最多的那个,也有可能是都转化成球数不是最多的那个(最少次数就为球最多的球数(可以等价为这种球一直在向别的转化))
AC代码:
1 #include <cstdio>
2 #include <algorithm>
3 using namespace std;
4 int main()
5 {
6 int a[4];
7 while (~scanf ("%d %d %d",&a[1],&a[2],&a[3]))
8 {
9 sort (a+1,a+1+3);
10 if ( a[2] == a[1] || (a[2] - a[1]) % 3 ==0 ) //先看是否能把最少的转化成多的
11 printf ("%d\n",a[2]); //如果可以的话,实际上是 a[2] 一直向 a[1]和 a[3]转化
12 else if ( a[2] == a[3] || (a[3] - a[2]) % 3 == 0 )
13 printf ("%d\n",a[3]); //结合上一种,这一种也可以理解
14 else if ( a[1] == a[3] || (a[3] - a[1]) % 3 == 0 )
15 printf ("%d\n",a[3]); //实际上,这种情况完全可以和上一种合并,但是为了程序的清楚就分开了
16 //else if ( a[2] == a[3] || (a[3] - a[2]) % 3 == 0 || a[1] == a[3] || (a[3] - a[1]) % 3 == 0 )
17 // printf ("%d\n",a[3]);
18 //最后两个 else if 可以合并成这样
19 else
20 printf ("):\n");
21 }
22 return 0;
23 }
原文:http://www.cnblogs.com/yoke/p/5936665.html