赤、緑、青の3種類の石を1つずつ使って1つのアクセサリーができる。 石は同じ色の石2個を別の色の石1個に交換することができる。 最初に持っている赤、緑、青の石から最大何個のアクセサリーを作ることができるか?
R G B Rは赤い石の個数、Gは緑の石の個数、Bは青の石の個数をあらわす。 R,G,Bはそれぞれ0以上の整数。(0 <= R,G,B <= 1000万)
作れるアクセサリーの数を1行で出力せよ。 最後に改行を忘れずに。
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input4";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("2 1 1");
//1
//赤い石が2個、緑の石が1個、青の石が1個ある。
//それぞれ1個の石を使って1つのアクセサリーができる。
//赤い石が1つ残るがもうアクセサリーは作れない。
}
else if (InputPattern == "Input2") {
WillReturn.Add("1 0 3");
//1
//赤い石が1個、緑の石が0個、青の石が3個ある。
//緑の石が無いが青い石2個を緑の石1個に変えることができる。
//よって、赤、緑、青の石を1個ずつでアクセサリーが1つできる。
}
else if (InputPattern == "Input3") {
WillReturn.Add("2 2 0");
//0
//赤い石が2個、緑の石が2個、青の石が0個ある。
//この場合、どのようにしてもアクセサリーはできない。
}
else if (InputPattern == "Input4") {
WillReturn.Add("5 18 36");
//16
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] ColorArr = InputList[0].Split(' ').Select(X => int.Parse(X)).ToArray();
int TotalCreateCnt = 0;
//石を1つずつ使って、アクセサリを作れるだけ作る
Action CreateAct = () =>
{
int MinCnt = ColorArr.Min();
if (MinCnt == 0) return;
TotalCreateCnt += MinCnt;
for (int I = 0; I <= ColorArr.GetUpperBound(0); I++)
ColorArr[I] -= MinCnt;
PrintInfo(ColorArr);
};
//最大数の石を、最小数の石に交換
Action ChangeAct = () =>
{
int MinCnt = ColorArr[0], MaxCnt = ColorArr[0];
int wkIndMin = 0, wkIndMax = 0;
for (int I = 1; I <= ColorArr.GetUpperBound(0); I++) {
if (MinCnt > ColorArr[I]) {
MinCnt = ColorArr[I];
wkIndMin = I;
}
if (MaxCnt < ColorArr[I]) {
MaxCnt = ColorArr[I];
wkIndMax = I;
}
}
ColorArr[wkIndMax] -= 2;
ColorArr[wkIndMin]++;
PrintInfo(ColorArr);
};
PrintInfo(ColorArr);
CreateAct();
while (Array.Exists(ColorArr, X => X >= 2)) {
ChangeAct();
CreateAct();
}
Console.WriteLine(TotalCreateCnt);
}
//石情報をデバッグ表示
static void PrintInfo(int[] pColorArr)
{
Array.ForEach(pColorArr, X => Console.Write("{0},", X));
Console.WriteLine();
}
}
5,18,36, 0,13,31, 1,13,29, 0,12,28, 1,12,26, 0,11,25, 1,11,23, 0,10,22, 1,10,20, 0,9,19, 1,9,17, 0,8,16, 1,8,14, 0,7,13, 1,7,11, 0,6,10, 1,6,8, 0,5,7, 1,5,5, 0,4,4, 1,2,4, 0,1,3, 1,1,1, 0,0,0, 16
制約が緩いので、貪欲法でナイーブに解いてます。