A - 孫子算経

実行時間制限: 2 sec / メモリ制限: 64 MB


問題文

いま、物が有る。
その数は 1 以上 127 以下である。
3 で割ると、 a 余る。 5 で割ると、 b 余る。 7 で割ると、 c 余る。
いくつ物があるとそうなるか小さい順に答えよ。


入力

入力は以下の形式で標準入力から与えられる。
a b c
  • 入力として 3 つの整数 a ( 0 \leq a \leq 2 ), b ( 0 \leq b \leq 4 ), c ( 0 \leq c \leq 6 ) が空白で区切られて 1 行で与えられる。

出力

条件を満たす物の数を小さい順に改行区切りで出力せよ。
なお、行の終端には改行が必要である。

入力例 1

2 3 2

出力例 1

23

入力例 2

1 1 1

出力例 2

1
106

入力例 3

2 4 6

出力例 3

104

出典

天下一プログラマーコンテスト2012 予選B
B - camel_case

実行時間制限: 2 sec / メモリ制限: 64 MB


問題文

以下の通りに、「キャメルケースの文字列」と「アンダースコア区切りの文字列」を定めます。

単語
英小文字で始まる、英小文字・数字から成る文字列
キャメルケースの文字列
1つ以上の単語を、最初の単語以外の先頭の文字を大文字にして連結した文字列
アンダースコア区切りの文字列
1つ以上の単語を、単語の間を1つのアンダースコアで区切って連結した文字列

また、キャメルケースの文字列とアンダースコア区切りの文字列には、 連結した後、最初や最後に1つ以上のアンダースコアが追加されることがあります。

文字列が与えられるので、キャメルケースの文字列とアンダースコア区切りの文字列を相互変換してください。
追加された行頭・行末のアンダースコアはそのまま保持するものとし、
キャメルケースの文字列でもアンダースコア区切りの文字列でもない場合は与えられた文字列をそのまま出力するものとします。
また、キャメルケースの文字列とアンダースコア区切りの文字列の両方に解釈できる文字列は
どちらであると考えても相互変換した結果が等しくなることが保証されます。


入力

入力は以下の形式で標準入力から与えられる。
c_1c_2…c_N
  • 入力として文字列が 1 行で与えられる。
  • 入力の文字列長 N は、 1 \leq N \leq 50 を満たす。
  • i 文字目の文字 c_i は 大文字のアルファベット (A, , Z) 、 小文字のアルファベット (a, , z) 、 数字 (0, , 9) 、 アンダースコア (_ ) のいずれかである。

出力

入力として与えられた文字列を相互変換した文字列を標準出力に 1 行で出力せよ。
なお、行の終端には改行が必要である。

入力例 1

lower_camel_case

出力例 1

lowerCamelCase

入力例 2

_snakeCase_

出力例 2

_snake_case_

入力例 3

KLab

出力例 3

KLab

入力例 4

_

出力例 4

_

入力例 5

a_bc_9a_b

出力例 5

a_bc_9a_b

出典

天下一プログラマーコンテスト2012 予選B
C - 席が足りない

実行時間制限: 2 sec / メモリ制限: 64 MB


問題文

急成長中のK社は、ハイペースで採用しすぎて席が足りなくなってしまいました。
次のオフィスの移転先は決まっているのですが、それまでは少ない席をやりくりしないといけません。

幸い、社員の生活リズムがバラバラなので、ある人が退社したあとに別の人が出社するなら席をシェアすることにしました。
しかし、出社から退社まで席を移動しないようにしたいです。

また、プロジェクトごとにまとまって座りたいと考えています。
プロジェクトの社員全員がそのプロジェクトに割り当てられた席に座り、
それ以外の社員がそのプロジェクトに割り当てられた席に座ることがないようにしたいです。

あるプロジェクトの社員それぞれの出社時間と退社時間が与えられるので、
そのプロジェクトには最低何席割り当てる必要があるかを求めてください。


入力

入力は以下の形式で標準入力から与えられる。
N
Ts_1 Te_1
Ts_2 Te_2
:
:
Ts_N Te_N
  • 入力は N+1 行ある。
  • 1 行目には、社員数を表す N ( 1 \leq N \leq 15 ) が与えられる。
  • 2 行目からの N 行には i ( 1 \leq i \leq N ) 番目の社員の出社時間 Ts_i ( 00:00 \leq Ts_i \leq 23:59 ) と退社時間 Te_i ( Ts_i \lt Te_i \leq 35:59 ) が空白区切りとして与えられる。
  • Te_i \geq 24:00 は翌日を意味する。
  • 出社から退社までの時間が 24 時間以上になることはない。

部分点

プロジェクトの社員が少ない入力 ( 1 \leq N \leq 8 ) のみ正解すると、100 点満点に対して部分点として 20 点が与えられる。
また、すべての社員が 23:59 までに退社する入力 ( 1 \leq i \leq N に対し Te_i \leq 23:59 ) のみ正解すると、100 点満点に対して部分点として 30 点が与えられる。
上記 2 条件のいずれかを満たす入力すべてに正解すると、100 点満点に対して部分点として 50 点が与えられる。

出力

最低限プロジェクトに割り当てる必要のある座席の数を標準出力に 1 行で出力せよ。
なお、行の終端には改行が必要である。

入力例 1

3
10:00 12:00
12:00 14:00
14:00 18:00

出力例 1

1
  • 出社時刻・退社時刻が同じ場合は席をシェアすることができる。

入力例 2

3
00:00 09:00
08:00 17:00
16:00 25:00
  • 25:00 は翌日 01:00 を意味する。
  • この場合、この 3 人は席をシェアすることができない。

出力例 2

3

入力例 3

4
00:00 07:00
06:00 13:00
12:00 19:00
18:00 25:00

出力例 3

2

出典

天下一プログラマーコンテスト2012 予選B
D - 大爆発

実行時間制限: 3 sec / メモリ制限: 256 MB

問題文

マス目から成るステージが与えられ、そのステージに存在するブロックを爆弾を用いて全て壊すゲームを行います。
爆弾はブロックのないマスにのみ置くことができ、爆弾は置くとすぐに爆発し上下左右全てのブロックを破壊します。

例えば、図 1 のようなステージで座標 (1,3) に爆弾を置くと、上下左右 5 つのブロックを破壊することができます。
以降の座標とはステージの左上のマスを (0,0) とし、1 つ右のマスを (1,0)1 つ下のマスを (0,1) とします。
この際、図 1 における爆弾上部のブロックのように爆弾とブロックが隣接していなくても破壊され、ブロックがいくつ連続していても全て破壊されます。
また、爆弾右部のブロックのように各ブロックが隣接していなくても全て破壊されます。

1 : 爆弾がブロックを破壊する例

ステージ上にある全てのブロックを破壊するために必要な爆弾の個数を答えなさい。
また、全てのブロックを破壊することが不可能な場合は -1 と出力しなさい。


入力

入力は以下の形式で標準入力から与えられる。
H W
c_{(0,0)}c_{(1,0)}‥‥c_{(W-1,0)}
c_{(0,1)}c_{(1,1)}‥‥c_{(W-1,1)}
:
:
c_{(0,H-1)}c_{(1,H-1)}‥‥c_{(W-1,H-1)}
  • 入力は H+1 行ある。
  • 1 行目には、与えられるステージの縦の長さを表す整数 H(1≤H≤16) と 横の長さを表す整数 W(1≤W≤16) が空白を区切りとして与えられる。
  • 2 行目からの H 行には、各行にステージの各マス目に対するブロックの有無を表す状態 c_{(i,j)}(0≤i≤W-1, 0≤j≤H−1)W 文字ずつ与えられる。
    • c_{(i,j)} は下記のどちらかであり、それぞれ座標 (i,j) のマスが下記のような状態であることを表す。
      • . : そのマスにブロックが無いことを表し、そのマスには爆弾を置くことができる。
      • # : そのマスにブロックがあることを表し、そのマスには爆弾を置くことができない。

部分点

ステージのサイズが小さい入力 (1≤W≤5, 1≤H≤5) のみ正解すると、100 点満点に対して部分点として 50 点が与えられる。

出力

ステージ上にブロックが 1 つも存在しない状態にするために必要な爆弾の個数を標準出力に 1 行で出力せよ。
また、ステージ上にブロックが存在しない状態にすることができない場合は -1 と出力せよ。
なお、行の終端には改行が必要である。

入力例 1

5 5
.#.#.
.#...
...#.
#.#.#
#...#

出力例 1

2
  • 初期位置は図 1 が示す形なので、まず座標 (1,3) に爆弾を置くと座標 (0,3), (1,0), (1,1), (2,3), (4,3) のブロックを破壊することができます。
  • 次に座標 (3,4) の位置に爆弾を置くことで、残りのブロックを全て破壊できます。
  • したがって、ブロックを全て破壊するために必要な爆弾の個数は 2 個となります。

入力例 2

5 5
.#...
.#...
#####
.#...
.#...

出力例 2

3
  • まず、座標 (0,1) に爆弾を置き、(0,2)(1,1) のブロックを破壊します。
  • 次に、座標 (1,1) に爆弾を置き、(1,0), (1,2), (1,3), (1,4) のブロックを破壊します。
  • 最後に、座標 (1,2) に爆弾を置くことで、残りのブロックを全て破壊することができます。
  • したがって、ブロックを全て破壊するために必要な爆弾の個数は 3 個となります。

入力例 3

1 6
######

出力例 3

-1
  • どのマスにも爆弾を置くことができないので、ブロックを破壊することができません。

入力例 4

3 2
..
..
..

出力例 4

0
  • 与えられた時点でブロックが存在しない状態なので、爆弾は必要ありません。

出典

天下一プログラマーコンテスト2012 予選B