情報妖精の競プロ日記

AtCoderの問題に対する方針を主に書きます

yukicoder contest 218 A - テストケース

A問題の解説です。

問題

No.851 テストケース - yukicoder

問題文(要約)

問題文

3個の数字が与えられる。
そのうち2つを足した値として考えられるもののうち、2番目に大きいものを出力せよ。
ただし改行区切りではなく空白区切りで与えられた場合、代わりに"assert"を出力せよ。

制約

  • N = 3
  • 1 \leq A_i \leq 10^10
  • A_1 \neq A_N


まず、改行区切りで正しく与えられた場合の答えを考えてみましょう。
全探索するのも一つの手であり、実際に全部のパターンを網羅すれば良さそうです。
ここでは、もう少し賢い考え方で解く方法を説明します。

まず、A_1 \neq A_2かつA_2 \neq A_3である、つまり全ての値が異なるときを考えます。
この時、最小値+中央値<最小値+最大値<中央値+最大値なので、答えは最小値+最大値、すなわち\min(A_1,A_2,A_3)+\max(A_1,A_2,A_3)に他なりません。
また、A_2がどちらかの値と等しい場合を考えます。
この時は最小値を出力する問題であり、これは\min(A_1, A_2)+\min(A_2,A_3)を選ぶということに等しいです。
A_2は必ずどちらかとは等しいので、両方でA_2と等しい値を選ぶようなパターンも存在するため問題がありません。
これで全てのパターンを網羅してるので、答えが求まりました。

さて、後は改行区切りか空白区切りか判定する方法ですが、一番楽なのは1行読み込んでみる方法ではないでしょうか。
1行読み込んでみて、それを空白区切りにsplitできれば"assert"を出力するようにすると楽そうです。

感想

この問題は、★1の簡単な問題をとりあえず作るか―と思って作ってみました。
AtCoderとかでもうっかり改行区切りのテストケースが混入してたとかで問題になったりするので、それをどう対処するかという感じの問題にしてみました。
これでC++Javaなど普段区切り記号を意識しない言語でも判定ができるようになったので、writerをやる人は区切り記号をちゃんとチェックできるようになったと思います。(ほんとか?)
なお、かなり問題の制約が意地悪い感じになっていますが、それはこの後の問題も罠があるよーという警告です。
そういうwriterだよって自己紹介を兼ねてる感じ、かな?
まぁやったら★1.5になったんですが