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




  keyword:	
  シミュレーション、貪欲法	
  
5	
 
                                        4	
                         3	
 
           2	
           3	
 
1
                                1   1   1
                                                             4	
           4	
 
    2	
           2	
                          3	
 
                                1   1   1




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



はみ出ないように	
  
  詰める!	
                                              5	
                  5	
 
    ⇒
5	
 
                                       4	
                                3	
 
           2	
          3	
 
1
                               1   1   1
                                                                   4	
           4	
 
    2	
           2	
  5	
 
                               1   1   1はいくつ必要?	
 
                                              3	
 




はみ出ないように	
  
  詰める!	
                                             5	
                  5	
 
    ⇒
提供	
 
                            この問題は	
 
                                       5	
 
                            4	
               3	
 
      2	
    3	
 
株式会社	
 リクルートコミュニケーションズ	
  
 1
             1  1 1

   2	
 
        http://www.rco.recruit.co.jp/	
  4	
 
        2	
          3	
 
                            4	
 
                    1   1   1


                    さんの提供でお送りしました	
 
  はみ出ないように	
  
    詰める!	
                5	
       5	
 
      ⇒	
    [!]	
  問題の原案をいただきました。ありがとうございました。
¡  落ち着いて考えれば難しくないはずです	
  
	
  
¡  基本戦略	
  :	
  大きい方から詰めていけば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---
-----
-----
        -----
        ***--
        ***--
                -----
                ***--
                ***--
                        1	
 
-----   ***--   ***--
                	
 
XX---   -----
XX---   -----
-----   ***--
-----   ***--
-----   ***--
XXXX-   -----   -----
XXXX-
-----
-----
        -----
        ***--
        ***--
                -----
                ***--
                ***--
                        2	
 
-----   ***--   ***--
                	
 
XXXX-   -----
XXXX-   -----
-----   ***--
-----   ***--
-----   ***--
XXXX-   -----   -----
XXXX-
XX---
XX---
        -----
        ***--
        ***--
                -----
                ***--
                ***--
                        3	
 
-----   ***--   ***--
                	
 
XXXX-   -----
XXXX-   -----
XX---   ***--
XX---   ***--
-----   ***--
XXXX-   -----   -----
XXXX-
XXXX-
XXXX-
        -----
        ***--
        ***--
                -----
                ***--
                ***--
                        4	
 
-----   ***--   ***--
                	
 
XXXX-   -----
XXXX-   -----
XXXX-   ***--
XXXX-   ***--
-----   ***--
XXXX-   XX---   -----
XXXX-
XXXX-
XXXX-
        XX---
        ***--
        ***--
                -----
                ***--
                ***--
                        5	
 
-----   ***--   ***--
                	
 
XXXX-   XX---
XXXX-   XX---
XXXX-   ***--
XXXX-   ***--
-----   ***--
XXXX-   XXXX-   -----
XXXX-
XXXX-
XXXX-
        XXXX-
        ***--
        ***--
                -----
                ***--
                ***--
                        6	
 
-----   ***--   ***--
                	
 
XXXX-   XXXX-
XXXX-   XXXX-
XXXX-   ***--
XXXX-   ***--
-----   ***--
XXXX-   XXXX-   -----
XXXX-
XXXX-
XXXX-
        XXXX-
        ***--
        ***--
                -----
                ***--
                ***XX
                        7	
 
-----   ***--   ***XX
                	
 
XXXX-   XXXX-
XXXX-   XXXX-
XXXX-   ***--
XXXX-   ***XX
-----   ***XX
XXXX-   XXXX-   -----
XXXX-   XXXX-   -----
XXXX-   ***--   ***--
XXXX-   ***--   ***XX
-----   ***--   ***XX
                	
 
XXXX-   XXXX-
XXXX-
XXXX-
        XXXX-
        ***--           これ以上	
  
XXXX-
-----
        ***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%	
  

WUPC2nd D問題

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