#S0012. [ARC128B] Balls of Three Colors

[ARC128B] Balls of Three Colors

[ARC128B] Balls of Three Colors

题面翻译

这道题的题目是“三种颜色的球”。我们有 R 个红色球,G 个绿色球,B 个蓝色球。你可以进行以下操作任意次:选择两种不同颜色的球,将它们变成另外一种颜色的球。例如,你可以选择一个红球和一个蓝球,将它们变成两个绿球。你的目标是让所有球变成同一种颜色。

判断这个目标是否可行,如果可行,求出实现它所需的最少操作次数,否则输出-1。

题目描述

R R 個の赤いボール,G G 個の緑のボール,B B 個の青いボールがあります. あなたは,以下の操作を好きな回数繰り返すことができます.

  • 色の異なる 2 2 つのボールを選び,それら両方を残るもう一つの色のボールに変える.

例えば,赤いボールと青いボールを選んだ際は,それら両方を緑のボールに変えます.

あなたの目標は,すべてのボールを同じ色にすることです. 目標が達成可能であるか判定し,また可能であるなら,必要な操作回数の最小値を求めてください.

1 1 つの入力ファイルにつき,T T 個のテストケースを解いてください.

输入格式

入力は以下の形式で標準入力から与えられる.

T T case1 case_1 case2 case_2 \vdots caseT case_T

各ケースは以下の形式で与えられる.

R R G G B B

输出格式

各ケースについて,目標が達成不可能な場合は -1 を,そうでなければ必要な操作回数の最小値を出力せよ.

样例 #1

样例输入 #1

3
1 2 2
1 2 3
1 2 4

样例输出 #1

2
-1
4

提示

制約

  • 1  T  100 1\ \leq\ T\ \leq\ 100
  • 1  R,G,B  108 1\ \leq\ R,G,B\ \leq\ 10^8
  • 入力される値はすべて整数である

Sample Explanation 1

例えば,case3 case_3 については,以下のように操作を行えばよいです. - 緑のボールと青いボールを選び,それら両方を赤いボールに変える - 赤いボールと青いボールを選び,それら両方を緑のボールに変える - 赤いボールと青いボールを選び,それら両方を緑のボールに変える - 赤いボールと青いボールを選び,それら両方を緑のボールに変える

#include<bits/stdc++.h>
using namespace std;
int main() {
	int t;
	cin >> t;
	while(t--){
		int a,b,c,k;
		cin >> a >> b >> c;
		if(a>b)swap(a,b);
		if(b>c)swap(b,c);
		if(a>b)swap(a,b);
		/*
		k次变换,a,b变成一样,a+2k == b-k; 3k = b-a 
		k次变换,a,c变成一样,a+2k == c-k; 3k = c-a
		k次变换,b,c变成一样,b+2k == c-k; 3k = c-b  
		*/
		int ma=0x3f3f3f3f;
		if((b-a)%3==0){
			k = (b-a)/3;
			ma = min(ma,k+(b-k));
		}
		if((c-a)%3==0){
			k=(c-a)/3;
			ma = min(ma,k+(c-k));
		}
		if((c-b)%3==0){
			k=(c-b)/3;
			ma = min(ma,k+(c-k));
		}
		if(ma==0x3f3f3f3f){
			cout << -1<<endl;
		}else{
			cout << ma << endl;
		}
	}
	return 0; 
}

Statistics

Related

In following homework:

备考-csp训练