using System; using System.Collections.Generic; using System.Linq; class Program { static string InputPattern = "InputX"; static List GetInputList() { var WillReturn = new List(); if (InputPattern == "Input1") { WillReturn.Add("2 3 1"); WillReturn.Add("0 7"); //6 //最初、座標0に1匹、座標7に1匹アメーバがいます。 //1秒後、アメーバは座標-3、0、3、4、7、10に合計6匹います。 } else if (InputPattern == "Input2") { WillReturn.Add("2 3 2"); WillReturn.Add("0 6"); //7 //最初、座標0に1匹、座標6に1匹アメーバがいます。 //1秒後、アメーバは座標-3、0、3、6、9に合計5匹います。 //座標3でアメーバが合体して1匹になりました。 //2秒後、アメーバは座標-6、-3、0、3、6、9、12に合計7匹います。 } else if (InputPattern == "Input3") { WillReturn.Add("2 3 1"); WillReturn.Add("0 2"); //6 //最初、座標0に1匹、座標2に1匹アメーバがいます。 //1秒後、アメーバは座標-3、-1、0、2、3、5に合計6匹います。 //分裂後の移動中にアメーバが合体することはありません。 //同じ座標にいるときのみ合体が発生します。 } else { string wkStr; while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr); } return WillReturn; } //T秒後のアメーバの情報 struct AmebaInfoDef { internal int StartZahyou; internal int ModVal; //Dを法としての剰余 internal int MinZahyou; internal int MaxZahyou; } static void Main() { List InputList = GetInputList(); int[] wkArr = InputList[0].Split(' ').Select(X => int.Parse(X)).ToArray(); int D = wkArr[1]; int T = wkArr[2]; int[] XArr = InputList[1].Split(' ').Select(X => int.Parse(X)).ToArray(); //Dを法としてグループ分けする var AmebaInfoList = new List(); foreach (int EachInt in XArr) { AmebaInfoDef WillAdd; WillAdd.ModVal = EachInt % D; //負の剰余は扱わない if (WillAdd.ModVal < 0) WillAdd.ModVal += D; WillAdd.StartZahyou = EachInt; WillAdd.MinZahyou = EachInt - D * T; WillAdd.MaxZahyou = EachInt + D * T; AmebaInfoList.Add(WillAdd); } //Dを法とした剰余ごとにマージ可能ならマージする AmebaInfoList.Sort((A, B) => { int wkInt = A.ModVal.CompareTo(B.ModVal); if (wkInt != 0) return wkInt; return A.MinZahyou.CompareTo(B.MinZahyou); }); //Console.WriteLine("■■■マージ前のアメーバ情報■■■"); //DebugPrint(AmebaInfoList); for (int I = AmebaInfoList.Count - 1; 1 <= I; I--) { if (AmebaInfoList[I - 1].ModVal != AmebaInfoList[I].ModVal) continue; //オーバーラップしている場合 if (AmebaInfoList[I - 1].MinZahyou <= AmebaInfoList[I].MinZahyou && AmebaInfoList[I].MinZahyou <= AmebaInfoList[I - 1].MaxZahyou) { AmebaInfoDef WillUpdate = AmebaInfoList[I - 1]; WillUpdate.MaxZahyou = AmebaInfoList[I].MaxZahyou; AmebaInfoList[I - 1] = WillUpdate; AmebaInfoList.RemoveAt(I); } } //Console.WriteLine("■■■マージ後のアメーバ情報■■■"); //DebugPrint(AmebaInfoList); long Answer = 0; AmebaInfoList.ForEach(X => Answer += (X.MaxZahyou - X.MinZahyou) / D + 1); Console.WriteLine(Answer); } //デバッグ用でアメーバ情報を出力 static void DebugPrint(List pAmebaInfoList) { foreach (AmebaInfoDef EachAmebaInfo in pAmebaInfoList) { Console.WriteLine("開始座標={0,2},剰余={1,2},最小座標={2,2},最大座標={3,2}", EachAmebaInfo.StartZahyou, EachAmebaInfo.ModVal, EachAmebaInfo.MinZahyou, EachAmebaInfo.MaxZahyou); } } }