题意:有三种球,每两种球各一个可以变换成第三种球两个。这种规则不能反过来使用,求最少的步数能够把三种球换成1种球。
题解:首先考虑三种球(a、b、c)的各种情况:
第一种情况:a==b!=c(即有两种球数量相等)此时答案为:a;
第二种情况:a==b==c(即三种球数量都相等) 此时答案为:a;
第三种情况:全转化为a或全转化为b或者全部转化为c,他们能够转化成功的条件为:
题解:首先考虑三种球(a、b、c)的各种情况:
第一种情况:a==b!=c(即有两种球数量相等)此时答案为:a;
第二种情况:a==b==c(即三种球数量都相等) 此时答案为:a;
第三种情况:全转化为a或全转化为b或者全部转化为c,他们能够转化成功的条件为:
c-b是3的倍数,c-a是3的倍数,b-a是3的倍数(比如转化成a,首先把b,c(c>b)数量转成一样的即(c-b)/3*2+b,其需要(c-b)/3次,在把b,c转化为a需要(c-b)/3*2+b次,总次数为(c-b)/3+(c-b)/3*2+b=c次其中不用考虑a转成负数的情况,因为全部转化成a的时候肯定是正数。。。)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int a[3],s;
while(~scanf("%d%d%d",&a[0],&a[1],&a[2])){
sort(a,a+3);
s=a[2];
if(a[0]==a[1]){
s=a[1];
}else if(a[1]==a[2]){
s=a[1];
}else if((a[1]-a[0])%3==0){//1 4 5
s=a[1];
}else if((a[2]-a[1])%3==0){//1 2 5
s=a[2];
}else if((a[2]-a[0])%3==0){//1 2 4
s=a[2];
}else{
printf("):\n");
continue;
}
printf("%d\n",s);
}
return 0;
}