結果

問題 No.966 引き算をして門松列(その1)
ユーザー with_yoruwith_yoru
提出日時 2020-01-13 22:31:07
言語 C#(csc)
(csc 3.9.0)
結果
AC  
実行時間 54 ms / 2,000 ms
コード長 2,946 bytes
コンパイル時間 4,981 ms
コンパイル使用メモリ 115,704 KB
実行使用メモリ 20,864 KB
最終ジャッジ日時 2024-06-02 07:48:17
合計ジャッジ時間 3,735 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 25 ms
17,792 KB
testcase_01 AC 24 ms
17,920 KB
testcase_02 AC 24 ms
17,664 KB
testcase_03 AC 23 ms
17,920 KB
testcase_04 AC 46 ms
19,584 KB
testcase_05 AC 48 ms
20,224 KB
testcase_06 AC 54 ms
20,864 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc)
Copyright (C) Microsoft Corporation. All rights reserved.

ソースコード

diff #

using System;

namespace yoru
{
	class Program
	{
		static void Main(string[] args)
		{
			string[] inputString;
			inputString = Console.ReadLine().Split(' ');
			Int32 T = Int32.Parse(inputString[0]);

			for (Int32 i = 0; i < T; ++i)
			{
				inputString = Console.ReadLine().Split(' ');
				Int64 A = Int64.Parse(inputString[0]);
				Int64 B = Int64.Parse(inputString[1]);
				Int64 C = Int64.Parse(inputString[2]);

				Int64 outputNumber = 0;

				// 既に門松列
				if (isKadomatu(A, B, C))
				{
					Console.WriteLine(outputNumber.ToString());
					continue;
				}

				// すべて同じ数字だったら、B-2, C-1 が最小
				if ((A == B) && (B == C))
				{
					B -= 2; outputNumber += 2;
					C -= 1; outputNumber += 1;

					if (!isKadomatu(A, B, C)) { outputNumber = -1; Console.WriteLine(outputNumber.ToString()); continue; }
					Console.WriteLine(outputNumber.ToString());
					continue;
				}

				// 両サイド同じ数字のとき
				if (A == C)
				{
					C--; outputNumber++;
					if (B == C) { B--; outputNumber++; }

					if (!isKadomatu(A, B, C)) { outputNumber = -1; Console.WriteLine(outputNumber.ToString()); continue; }
					Console.WriteLine(outputNumber.ToString());
					continue;
				}

				// 真ん中と外が同じ数字のとき
				if (B == A)
				{
					if (B < C) { B--; outputNumber++; }
					else
					{
						A--; outputNumber++;
						if (A == C) { A--; outputNumber++; }
					}

					if (!isKadomatu(A, B, C)) { outputNumber = -1; Console.WriteLine(outputNumber.ToString()); continue; }
					Console.WriteLine(outputNumber.ToString());
					continue;
				}
				if (B == C)
				{
					if (B < A) { B--; outputNumber++; }
					else
					{
						C--; outputNumber++;
						if (A == C) { C--; outputNumber++; }
					}

					if (!isKadomatu(A, B, C)) { outputNumber = -1; Console.WriteLine(outputNumber.ToString()); continue; }
					Console.WriteLine(outputNumber.ToString());
					continue;
				}

				// 同じ数字がないとき
				{
					// A>B>C にする
					if (A < C) { Int64 temp = C; C = A; A = temp; }

					Int64 diff1 = A - B;
					Int64 diff2 = B - C;

					if (diff1 >= diff2 && C > 1)
					{
						B -= (diff2 + 1); outputNumber += (diff2 + 1);
					}
					else
					{
						A -= (diff1 + 1); outputNumber += (diff1 + 1);
						if (A == C) { A--; outputNumber++; }
					}

					if (!isKadomatu(A, B, C)) { outputNumber = -1; Console.WriteLine(outputNumber.ToString()); continue; }
					Console.WriteLine(outputNumber.ToString());
					continue;
				}
			}
			return;
		}

		static bool isKadomatu(Int64 inA, Int64 inB, Int64 inC)
		{
			if (inA == inB) { return false; }
			if (inB == inC) { return false; }
			if (inC == inA) { return false; }

			if (inA < 1) { return false; }
			if (inB < 1) { return false; }
			if (inC < 1) { return false; }

			if (inA < inB && inB < inC) { return false; }
			if (inA > inB && inB > inC) { return false; }

			return true;
		}
	}
}
0