結果
問題 | No.33 アメーバがたくさん |
ユーザー | 明智重蔵 |
提出日時 | 2015-10-31 18:47:15 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
AC
|
実行時間 | 32 ms / 5,000 ms |
コード長 | 4,474 bytes |
コンパイル時間 | 1,075 ms |
コンパイル使用メモリ | 116,952 KB |
実行使用メモリ | 27,556 KB |
最終ジャッジ日時 | 2024-09-24 10:30:25 |
合計ジャッジ時間 | 1,977 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 30 ms
27,556 KB |
testcase_01 | AC | 31 ms
25,392 KB |
testcase_02 | AC | 30 ms
27,312 KB |
testcase_03 | AC | 31 ms
25,436 KB |
testcase_04 | AC | 31 ms
27,224 KB |
testcase_05 | AC | 29 ms
23,600 KB |
testcase_06 | AC | 31 ms
25,184 KB |
testcase_07 | AC | 30 ms
25,184 KB |
testcase_08 | AC | 30 ms
25,184 KB |
testcase_09 | AC | 32 ms
25,660 KB |
testcase_10 | AC | 29 ms
25,052 KB |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
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 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 long StartZahyou; internal long ModVal; //Dを法としての剰余 internal long MinZahyou; internal long MaxZahyou; } static void Main() { List<string> InputList = GetInputList(); long[] wkArr = InputList[0].Split(' ').Select(X => long.Parse(X)).ToArray(); long D = wkArr[1]; long T = wkArr[2]; long[] XArr = InputList[1].Split(' ').Select(X => long.Parse(X)).ToArray(); //Dを法としてグループ分けする var AmebaInfoList = new List<AmebaInfoDef>(); foreach (long 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<AmebaInfoDef> pAmebaInfoList) { foreach (AmebaInfoDef EachAmebaInfo in pAmebaInfoList) { Console.WriteLine("開始座標={0,2},剰余={1,2},最小座標={2,2},最大座標={3,2}", EachAmebaInfo.StartZahyou, EachAmebaInfo.ModVal, EachAmebaInfo.MinZahyou, EachAmebaInfo.MaxZahyou); } } }