28
keyword: シミュレーション、貪欲法 2回 早稲田大学プログラミングコンテスト

WUPC2nd D問題

Embed Size (px)

DESCRIPTION

第2回 早稲田大学プログラミングコンテストのD問題 : 5キューブ の解説スライドです。

Citation preview

Page 1: WUPC2nd D問題

keyword:  シミュレーション、貪欲法  

第2回 早稲田大学プログラミングコンテスト  

Page 2: WUPC2nd D問題

1 2 3 4 5

3

2 2 4

1 1 13 4

1 1 1

立方体のオブジェが  たくさん(各サイズにつき<=109)与えられます。

Page 3: WUPC2nd D問題

1 2 3 4 5

3

2 2 4

1 1 13 4

1 1 1

5 5

はみ出ないように  詰める!  ⇒

Page 4: WUPC2nd D問題

1 2 3 4 5

3

2 2 4

1 1 13 4

1 1 1

5 5

はみ出ないように  詰める!  ⇒

5 はいくつ必要?

Page 5: WUPC2nd D問題

1 2 3 4 5

3

2 2 4

1 1 13 4

1 1 1

5 5

はみ出ないように  詰める!  ⇒

この問題は

株式会社 リクルートコミュニケーションズ  http://www.rco.recruit.co.jp/

さんの提供でお送りしました

提供

[!]  問題の原案をいただきました。ありがとうございました。

Page 6: WUPC2nd D問題

¡ 落ち着いて考えれば難しくないはずです    ¡ 基本戦略  :  大きい方から詰めていけばOK  

¡ 以下の情報を変数で持っておく  § いくつコンテナを使ったか  :  answer  § それぞれのサイズのオブジェがいくつあるか  :  objects[size  :  1〜5]  

Page 7: WUPC2nd D問題

¡ これは、1つにつき必ず1コンテナ必要  § 他に何も詰められない  

 §  answer  +=  objects[5]  §  objects[5]  =  0  

Page 8: WUPC2nd D問題

¡ これも、1つにつき必ず1コンテナ必要  § 他に、あと1x1x1が  53-­‐43  =  61  個詰められる  

 §  answer  +=  objects[4]  §  objects[1]  -­‐=  min(objects[1],  61  *  objects[4])  §  objects[4]  =  0  

Page 9: WUPC2nd D問題

¡ これも、1つにつき必ず1コンテナ必要  § 他に、あと1x1x1が  53-­‐33  =  98  個詰められる  

¡ でも、可能ならば  2x2x2  を詰めたい。  §  3x3x3を入れたあとで、2x2x2はいくつ入る?  

Page 10: WUPC2nd D問題

5 3

このような状態であといくつ入るか?    立体のままだとわかりにくいので・・・

Page 11: WUPC2nd D問題

5

それぞれの高さの  断面図の状態を

3

Page 12: WUPC2nd D問題

5

それぞれの高さの  断面図の状態を

3

----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ***-- ***-- ***--

----- ----- ***-- ***-- ***-- ----- ----- ***-- ***-- ***--

テキストに表す

Page 13: WUPC2nd D問題

----- ----- ----- ----- ----- ----- ----- ----- ----- -----

----- ----- ***-- ***-- ***-- ----- ----- ***-- ***-- ***--

----- ----- ***-- ***-- ***--

XX XX

これに、

XX XX

が幾つ入るかを考える

Page 14: WUPC2nd D問題

XX--- XX--- ----- ----- ----- XX--- XX--- ----- ----- -----

----- ----- ***-- ***-- ***-- ----- ----- ***-- ***-- ***--

----- ----- ***-- ***-- ***--

1

Page 15: WUPC2nd D問題

XXXX- XXXX- ----- ----- ----- XXXX- XXXX- ----- ----- -----

----- ----- ***-- ***-- ***-- ----- ----- ***-- ***-- ***--

----- ----- ***-- ***-- ***--

2

Page 16: WUPC2nd D問題

XXXX- XXXX- XX--- XX--- ----- XXXX- XXXX- XX--- XX--- -----

----- ----- ***-- ***-- ***-- ----- ----- ***-- ***-- ***--

----- ----- ***-- ***-- ***--

3

Page 17: WUPC2nd D問題

XXXX- XXXX- XXXX- XXXX- ----- XXXX- XXXX- XXXX- XXXX- -----

----- ----- ***-- ***-- ***-- ----- ----- ***-- ***-- ***--

----- ----- ***-- ***-- ***--

4

Page 18: WUPC2nd D問題

XXXX- XXXX- XXXX- XXXX- ----- XXXX- XXXX- XXXX- XXXX- -----

XX--- XX--- ***-- ***-- ***-- XX--- XX--- ***-- ***-- ***--

----- ----- ***-- ***-- ***--

5

Page 19: WUPC2nd D問題

XXXX- XXXX- XXXX- XXXX- ----- XXXX- XXXX- XXXX- XXXX- -----

XXXX- XXXX- ***-- ***-- ***-- XXXX- XXXX- ***-- ***-- ***--

----- ----- ***-- ***-- ***--

6

Page 20: WUPC2nd D問題

XXXX- XXXX- XXXX- XXXX- ----- XXXX- XXXX- XXXX- XXXX- -----

XXXX- XXXX- ***-- ***-- ***-- XXXX- XXXX- ***-- ***XX ***XX

----- ----- ***-- ***XX ***XX

7

Page 21: WUPC2nd D問題

XXXX- XXXX- XXXX- XXXX- ----- XXXX- XXXX- XXXX- XXXX- -----

XXXX- XXXX- ***-- ***-- ***-- XXXX- XXXX- ***-- ***XX ***XX

----- ----- ***-- ***XX ***XX

これ以上  入らない!

Page 22: WUPC2nd D問題

¡ どのように詰めても、8個以上入らないことが分かります  § なので、3を1つにつき2を7個  § その隙間  :  (53-­‐33-­‐23*7  =  42)  に1を  § もちろん、2が余ったらその分を1で詰める  

¡  [!]  要注意ポイント  :  コーナーケース  

Page 23: WUPC2nd D問題

¡ 以上をプログラムにまとめると  

§  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  

Page 24: WUPC2nd D問題

¡ これは、コンテナに8つ詰められる  § 余ったら1x1x1を詰める  

§  containerForTwo  =  (objects[2]  +  7)  /  8  §  answer  +=  containerForTwo  §  objects[1]  -­‐=  min(objects[1],    

 125  *  containerForTwo  –  objects[2]  *  8)  §  objects[2]  =  0  

Page 25: WUPC2nd D問題

¡ それでも1x1x1が余ったら  §  1コンテナに付き125個詰める  

§  answer  +=  (objects[1]  +  124)  /  125  §  objects[1]  =  0  

§  answer  を出力  

Page 26: WUPC2nd D問題

¡ オーバーフロー  § 入力を最初からlongで受け取り、全部longで計算するとよい  

¡  3x3x3を詰める処理  §  2x2x2は7個入れてますか  §  2x2x2を途中で使い切った時、(入るはずだった2x2x2の所に)1x1x1を全て詰めていますか  

¡ 大きいサイズを詰める処理  §  1x1x1の変数がマイナスになってませんか  

Page 27: WUPC2nd D問題

¡  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  

Page 28: WUPC2nd D問題

¡  First  AC  :  uwi  (20:21)  

¡ 正解数  :  89  § 通した人(89/205)  :  43%  §  ACだった解答(89/571)  :  16%