AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC128-B Balls of Three Colors
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("3");
WillReturn.Add("1 2 2");
WillReturn.Add("1 2 3");
WillReturn.Add("1 2 4");
//2
//-1
//4
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(pX => int.Parse(pX)).ToArray();
foreach (string EachStr in InputList.Skip(1)) {
SplitAct(EachStr);
int R = wkArr[0];
int G = wkArr[1];
int B = wkArr[2];
int Result = Solve(R, G, B);
Console.WriteLine(Result);
}
}
static int Solve(int pR, int pG, int pB)
{
var Mod3List = new List<int>();
Mod3List.Add(pR % 3);
Mod3List.Add(pG % 3);
Mod3List.Add(pB % 3);
if (Mod3List.Distinct().Count() == 3) {
return -1;
}
var AnswerKouho = new List<int>();
if (pR % 3 == pG % 3) {
AnswerKouho.Add(Math.Max(pR, pG));
}
if (pR % 3 == pB % 3) {
AnswerKouho.Add(Math.Max(pR, pB));
}
if (pB % 3 == pG % 3) {
AnswerKouho.Add(Math.Max(pB, pG));
}
return AnswerKouho.Min();
}
}
解説
RGBの色を変化させた場合の個数を考えると
Rが-1
Gが-1
Bが+2
ですので、mod3で考えると -1 ≡ +2 (mod 3) なので
Rが+2
Gが+2
Bが+2
となります。
最終的に、RGBの2つを0にするので最終的には、
RGBの少なくとも2つを 0 (mod 3)
にする必要があるので、RGBのmod 3 が全て異なっていたら、
解なしとなります。
(R,G,B) = (3,9,5)で5に全て移動させる手順を考えると下記のようになります。
3 9 5
0 6 11
2 5 10
4 4 9
0 0 17
Gが単調減少しているので、これが最適解だと分かります。
(R,G,B) = (5,17,0)で0に全て移動させる手順を考えると下記のようになります。
5 17 0
0 12 10
2 11 9
4 10 8
6 9 7
8 8 8
0 0 16
Gが単調減少しているので、これが最適解だと分かります。
最終的に0にする色の2つで大きい数が移動回数と分かるので
この2つの組み合わせを全探索してます。