posts - 15,comments - 65,trackbacks - 0
                  本文最先發表在本人的個人博客http://www.lovestblog.cn
                  先把題目曬出來,這個題目不是很難,但是當時僅僅因為輸出的問題折騰了我大半天,在ACM提供的運行環境中只有到最后才能把結果輸出,不能在中途就把結果輸出來,不然老師看見那紅色的Wrong Answer,對于ACMER來說這是最不想看到的結果了,我們最喜歡看到藍色的Accepted,呵呵,因為這樣就說明你的程序通過了。
          Description
          一個工廠制造的產品形狀都是長方體,它們的高度都是h,長和寬都相等,一共有六個型號,他們的長寬分別為1*1, 2*2, 3*3, 4*4, 5*5, 6*6。這些產品通常使用一個 6*6*h 的長方體包裹包裝然后郵寄給客戶。因為郵費很貴,所以工廠要想方設法的減小每個訂單運送時的包裹數量。他們很需要有一個好的程序幫他們解決這個問題從而節省費用。現在這個程序由你來設計。

          Input
          輸入文件包括幾行,每一行代表一個訂單。每個訂單里的一行包括六個整數,中間用空格隔開,分別為1*1至6*6這六種產品的數量。輸入文件將以6個0組成的一行結尾。

          Output
          除了輸入的最后一行6個0以外,輸入文件里每一行對應著輸出文件的一行,每一行輸出一個整數代表對應的訂單所需的最小包裹數。

          Sample Input


          0 0 4 0 0 1
          7 5 1 0 0 0
          0 0 0 0 0 0

          Sample Output


          2
          1
          這就是題目了,這是北大ACM在線答題中的一道題目,看了下那通過率為38%(3875/10153),即總共提交了10153次,答案完全正確的是3875次,高人還是蠻多的,所以我一般選擇的題目都是難度在百分之三十多左右的,太難的我不敢做,有興趣的可以去網站上看看http://poj.grids.cn/problemlist,注冊個用戶答答題也蠻有意思的,但是只提供你有限的測試數據,當然當你提交的時候就不是幾組測試數據了,難度還是比較高的,稍不留神就通不過。
                對于這道題我最初這么思考的,對于6*6的一個箱子來說,最多只能放一個6*6或一個5*5或4*4的盒子,所以我們初始化需要的箱子數時就是這這幾種箱子的個數和,對于3*3的箱子來說,我們可以放一個或2個或3個或4個,這我們可以通過整除和取模來確定放了3*3盒子的箱子數,再把它加入到總箱子數中,接下來我們就是把1*1和2*2的盒子塞進前面所需的箱子中,當塞不完時再來新增盒子,我們首先要將前面的箱子剩余的空間統計出來,并且要以2*2的優先考慮,因為我們可以把多余的2*2的位置變為填充4個1*1的,畢竟1*1的只要有空間隨處都可以塞。所以當我們的箱子要是裝了1個5*5的盒子的話,那么它就只能塞1*1的了,一個可以塞11個1*1的,對于裝了4*4的盒子的話,那么還可以裝5個2*2的盒子,暫且不要去轉話成1*1的,除非沒辦法只能裝1*1的,對于3*3的話就可以根據取模之后一個箱子剩下的空間了,如果一個箱子中只放了一個3*3的,那么還剩下3個3*3的空間可以放,我們知道可以放5個2*2的和7個1*1的,對于放了2個3*3的箱子,我們剩下的空間可以放3個2*2的以及6個1*1的,對于放了3個3*3的箱子,我們只能放1個2*2的和5個1*1的,這樣一來我們就統計出了此時可以放2*2以及1*1的空間到底有多少,接下來我們就放箱子進去啊,放一個就減一個,知道1*1的和2*2的盒子都放完了,要是還沒有放完的話我們就新增箱子或者如果1*1的沒放完,而2*2的還有剩,那么就將每個2*2的轉化成4個1*1的就行了,具體實現就看下面的代碼吧,由于時間關系,就沒寫注釋了,要是哪里看不明白的,可以給我留言。
          import java.io.BufferedInputStream;
          import java.util.HashMap;
          import java.util.Map;
          import java.util.Scanner;

          public class Test {
              
          public static void main(String args[]){
                  Scanner sc
          =new Scanner(new BufferedInputStream(System.in));
                  
          boolean flag=true;
                  Map map
          =new HashMap();
                  
          int k=0;
                  
          while(flag){
                      
          int n[]=new int[6];
                      n[
          0]=sc.nextInt();
                      n[
          1]=sc.nextInt();
                      n[
          2]=sc.nextInt();
                      n[
          3]=sc.nextInt();
                      n[
          4]=sc.nextInt();
                      n[
          5]=sc.nextInt();
                      
          if(n[0]==0&&n[1]==0&&n[2]==0&&n[3]==0&&n[4]==0&&n[5]==0){
                          flag
          =false;
                      }
          else{
                          map.put(k, n);
                          k
          ++;
                      }

                  }

                  
          for(int i=0;i<map.size();i++){
                      
          int[] vs=(int[])map.get(i);
                      
          int boxNum=0;
                      boxNum
          +=vs[3]+vs[4]+vs[5];
                      
          if(vs[2]>0){
                          
          if(vs[2]%4==0){
                              boxNum
          +=vs[2]/4;
                          }
          else{
                              boxNum
          +=vs[2]/4+1;
                          }

                      }

                      
          int for1=vs[4]*11;
                      
          int for2=vs[3]*5;
                      
          if(vs[2]%4==1){
                          for1
          +=7;
                          for2
          +=5;
                      }
          else if(vs[2]%4==2){
                          for1
          +=6;
                          for2
          +=3;
                      }
          else if(vs[2]%4==3){
                          for1
          +=5;
                          for2
          +=1;
                      }

                      
          if(vs[0]<for1){
                          vs[
          0]=0;
                      }
          else{
                          vs[
          0]=vs[0]-for1;
                      }

                      
          if(vs[1]<for2){
                          
          if(vs[0]>0){
                              
          if(4*(for2-vs[1])-vs[0]>=0){
                                  vs[
          0]=0;
                              }
          else{
                                  vs[
          0]=vs[0]-4*(for2-vs[1]);
                              }

                          }

                          vs[
          1]=0;
                      }
          else{
                          vs[
          1]=vs[1]-for2;
                      }

                      
          if(!(vs[0]==0&&vs[1]==0)){
                          
          if(vs[1]>0){
                              
          if(vs[1]%9==0){
                                  boxNum
          +=vs[1]/9;
                              }
          else{
                                  boxNum
          +=vs[1]/9+1;
                                  
          if(vs[0]>(9-(vs[1]%9))*4){
                                      
          if((vs[0]-(9-(vs[1]%9))*4)%36==0){
                                          boxNum
          +=(vs[0]-(9-(vs[1]%9))*4)/36;
                                      }
          else{
                                          boxNum
          +=(vs[0]-(9-(vs[1]%9))*4)/36+1;
                                      }

                                  }

                              }

                          }
          else if(vs[0]>0){
                              
          if(vs[0]%36==0){
                                  boxNum
          +=vs[0]/36;
                              }
          else{
                                  boxNum
          +=vs[0]/36+1;
                              }

                          }

                      }

                      System.out.println(boxNum);
                  }

              }

          }

          posted on 2009-05-26 11:00 你假笨 閱讀(1747) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 衡东县| 宜丰县| 应用必备| 嵊州市| 英德市| 辰溪县| 阿图什市| 建始县| 永福县| 微山县| 郴州市| 镇远县| 长武县| 读书| 化德县| 江西省| 通榆县| 大同县| 安义县| 福海县| 砚山县| 荔浦县| 砀山县| 彰化市| 嫩江县| 土默特左旗| 奎屯市| 灵寿县| 邵阳县| 苏尼特右旗| 西盟| 丽江市| 丽水市| 聂拉木县| 太仓市| 宁乡县| 修武县| 施秉县| 建水县| 黔西县| 英山县|