AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC013-B 引越しできるかな?
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("2");
WillReturn.Add("10 20 30");
WillReturn.Add("20 20 20");
//12000
}
else if (InputPattern == "Input2") {
WillReturn.Add("3");
WillReturn.Add("10 20 30");
WillReturn.Add("20 20 20");
WillReturn.Add("30 20 10");
//12000
}
else if (InputPattern == "Input3") {
WillReturn.Add("4");
WillReturn.Add("10 20 30");
WillReturn.Add("20 20 20");
WillReturn.Add("30 20 10");
WillReturn.Add("10 40 10");
//16000
}
else if (InputPattern == "Input4") {
WillReturn.Add("2");
WillReturn.Add("10 10 10");
WillReturn.Add("11 1 1");
//1100
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
struct XYZInfoDef
{
internal int X;
internal int Y;
internal int Z;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(pX => int.Parse(pX)).ToArray();
var XYZInfoList = new List<XYZInfoDef>();
foreach (string EachStr in InputList.Skip(1)) {
SplitAct(EachStr);
XYZInfoDef WillAdd;
Array.Sort(wkArr);
WillAdd.X = wkArr[0];
WillAdd.Y = wkArr[1];
WillAdd.Z = wkArr[2];
XYZInfoList.Add(WillAdd);
}
int MaxX = XYZInfoList.Max(pX => pX.X);
int MaxY = XYZInfoList.Max(pX => pX.Y);
int MaxZ = XYZInfoList.Max(pX => pX.Z);
Console.WriteLine(MaxX * MaxY * MaxZ);
}
}
解説
10 20 30
20 20 20
30 20 10
10 40 10
というケースで考えます。
X Y Zは入れ替え可能なのでソートして考えても良いです。
10 20 30
20 20 20
10 20 30
10 10 40
大きいほうから考えて、40はどうせ梱包するので
40は確定します。
他のダンボールはなるべく大きい値を使ったほうが得なので
確定した40を除くと下記となります。
10 20
20 20
10 20
10 10
同様の考え方で、残りの長さも20と決まりますね。