keyword: シミュレーション、貪欲法
第2回 早稲田大学プログラミングコンテスト
1 2 3 4 5
3
2 2 4
1 1 13 4
1 1 1
立方体のオブジェが たくさん(各サイズにつき<=109)与えられます。
1 2 3 4 5
3
2 2 4
1 1 13 4
1 1 1
5 5
はみ出ないように 詰める! ⇒
1 2 3 4 5
3
2 2 4
1 1 13 4
1 1 1
5 5
はみ出ないように 詰める! ⇒
5 はいくつ必要?
1 2 3 4 5
3
2 2 4
1 1 13 4
1 1 1
5 5
はみ出ないように 詰める! ⇒
この問題は
株式会社 リクルートコミュニケーションズ http://www.rco.recruit.co.jp/
さんの提供でお送りしました
提供
[!] 問題の原案をいただきました。ありがとうございました。
¡ 落ち着いて考えれば難しくないはずです ¡ 基本戦略 : 大きい方から詰めていけばOK
¡ 以下の情報を変数で持っておく § いくつコンテナを使ったか : answer § それぞれのサイズのオブジェがいくつあるか : objects[size : 1〜5]
¡ これは、1つにつき必ず1コンテナ必要 § 他に何も詰められない
§ answer += objects[5] § objects[5] = 0
¡ これも、1つにつき必ず1コンテナ必要 § 他に、あと1x1x1が 53-‐43 = 61 個詰められる
§ answer += objects[4] § objects[1] -‐= min(objects[1], 61 * objects[4]) § objects[4] = 0
¡ これも、1つにつき必ず1コンテナ必要 § 他に、あと1x1x1が 53-‐33 = 98 個詰められる
¡ でも、可能ならば 2x2x2 を詰めたい。 § 3x3x3を入れたあとで、2x2x2はいくつ入る?
5 3
このような状態であといくつ入るか? 立体のままだとわかりにくいので・・・
5
それぞれの高さの 断面図の状態を
3
5
それぞれの高さの 断面図の状態を
3
----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ***-- ***-- ***--
----- ----- ***-- ***-- ***-- ----- ----- ***-- ***-- ***--
テキストに表す
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
----- ----- ***-- ***-- ***-- ----- ----- ***-- ***-- ***--
----- ----- ***-- ***-- ***--
XX XX
これに、
XX XX
が幾つ入るかを考える
XX--- XX--- ----- ----- ----- XX--- XX--- ----- ----- -----
----- ----- ***-- ***-- ***-- ----- ----- ***-- ***-- ***--
----- ----- ***-- ***-- ***--
1
XXXX- XXXX- ----- ----- ----- XXXX- XXXX- ----- ----- -----
----- ----- ***-- ***-- ***-- ----- ----- ***-- ***-- ***--
----- ----- ***-- ***-- ***--
2
XXXX- XXXX- XX--- XX--- ----- XXXX- XXXX- XX--- XX--- -----
----- ----- ***-- ***-- ***-- ----- ----- ***-- ***-- ***--
----- ----- ***-- ***-- ***--
3
XXXX- XXXX- XXXX- XXXX- ----- XXXX- XXXX- XXXX- XXXX- -----
----- ----- ***-- ***-- ***-- ----- ----- ***-- ***-- ***--
----- ----- ***-- ***-- ***--
4
XXXX- XXXX- XXXX- XXXX- ----- XXXX- XXXX- XXXX- XXXX- -----
XX--- XX--- ***-- ***-- ***-- XX--- XX--- ***-- ***-- ***--
----- ----- ***-- ***-- ***--
5
XXXX- XXXX- XXXX- XXXX- ----- XXXX- XXXX- XXXX- XXXX- -----
XXXX- XXXX- ***-- ***-- ***-- XXXX- XXXX- ***-- ***-- ***--
----- ----- ***-- ***-- ***--
6
XXXX- XXXX- XXXX- XXXX- ----- XXXX- XXXX- XXXX- XXXX- -----
XXXX- XXXX- ***-- ***-- ***-- XXXX- XXXX- ***-- ***XX ***XX
----- ----- ***-- ***XX ***XX
7
XXXX- XXXX- XXXX- XXXX- ----- XXXX- XXXX- XXXX- XXXX- -----
XXXX- XXXX- ***-- ***-- ***-- XXXX- XXXX- ***-- ***XX ***XX
----- ----- ***-- ***XX ***XX
これ以上 入らない!
¡ どのように詰めても、8個以上入らないことが分かります § なので、3を1つにつき2を7個 § その隙間 : (53-‐33-‐23*7 = 42) に1を § もちろん、2が余ったらその分を1で詰める
¡ [!] 要注意ポイント : コーナーケース
¡ 以上をプログラムにまとめると
§ answer += objects[3] § useTwo = min(objects[2], objects[3] * 7) § objects[2] -‐= useTwo § objects[1] -‐= min(objects[1],
(125 -‐ 27) * objects[3] – useTwo * 8) § objects[3] = 0
¡ これは、コンテナに8つ詰められる § 余ったら1x1x1を詰める
§ containerForTwo = (objects[2] + 7) / 8 § answer += containerForTwo § objects[1] -‐= min(objects[1],
125 * containerForTwo – objects[2] * 8) § objects[2] = 0
¡ それでも1x1x1が余ったら § 1コンテナに付き125個詰める
§ answer += (objects[1] + 124) / 125 § objects[1] = 0
§ answer を出力
¡ オーバーフロー § 入力を最初からlongで受け取り、全部longで計算するとよい
¡ 3x3x3を詰める処理 § 2x2x2は7個入れてますか § 2x2x2を途中で使い切った時、(入るはずだった2x2x2の所に)1x1x1を全て詰めていますか
¡ 大きいサイズを詰める処理 § 1x1x1の変数がマイナスになってませんか
¡ 0 70 10 0 0 -‐> 10 ¡ 0 71 10 0 0 -‐> 11 ¡ 244 0 0 4 0 -‐> 4 ¡ 245 0 0 4 0 -‐> 5 ¡ 420 70 10 0 0 -‐> 10 ¡ 421 70 10 0 0 -‐> 11 ¡ 92 13 2 0 0 -‐> 2 ¡ 93 13 2 0 0 -‐> 3
¡ First AC : uwi (20:21)
¡ 正解数 : 89 § 通した人(89/205) : 43% § ACだった解答(89/571) : 16%