• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            superman

            聚精會神搞建設 一心一意謀發展
            posts - 190, comments - 17, trackbacks - 0, articles - 0
               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            Section 1.4 - Packing Rectangles

            Posted on 2009-03-19 16:35 superman 閱讀(332) 評論(0)  編輯 收藏 引用 所屬分類: USACO
              1 #include <iostream>
              2 
              3 using namespace std;
              4 
              5 int max(int a, int b, int c)
              6 {
              7     return max(max(a, b), c);
              8 }
              9 
             10 int max(int a, int b, int c, int d)
             11 {
             12     return max(max(a, b, c), d);
             13 }
             14 
             15 struct Rectangle
             16 {
             17     int h;  //height
             18     int w;  //width
             19 }   rect[4];
             20 
             21 int ans = 65535;
             22 int ans_cnt = 0;
             23 int ans_w[24], ans_h[24];
             24 
             25 void updateAns(int tot_w, int tot_h)
             26 {
             27     if (tot_w * tot_h <= ans)
             28     {
             29         if (tot_w * tot_h < ans)
             30         {
             31             ans = tot_w * tot_h;
             32             ans_cnt = 0;
             33         }
             34         for (int i = 0; i < ans_cnt; i++)
             35             if (ans_w[i] == min(tot_w, tot_h) && ans_h[i] == max(tot_w, tot_h))
             36                 return;
             37         ans_w[ans_cnt] = min(tot_w, tot_h);
             38         ans_h[ans_cnt] = max(tot_w, tot_h);
             39         ans_cnt++;
             40     }
             41 }
             42 
             43 void calcArea(int x[], int i)
             44 {
             45     int h0 = rect[x[0]].h; int w0 = rect[x[0]].w;
             46     int h1 = rect[x[1]].h; int w1 = rect[x[1]].w;
             47     int h2 = rect[x[2]].h; int w2 = rect[x[2]].w;
             48     int h3 = rect[x[3]].h; int w3 = rect[x[3]].w;
             49     if ((i & 1== 1) swap(h0, w0);
             50     if ((i & 2== 2) swap(h1, w1);
             51     if ((i & 4== 4) swap(h2, w2);
             52     if ((i & 8== 8) swap(h3, w3);
             53 
             54     int tot_w, tot_h;
             55 
             56     //1
             57     tot_h = max(h0, h1, h2, h3);
             58     tot_w = w0 + w1 + w2 + w3;
             59     updateAns(tot_w, tot_h);
             60     //2
             61     tot_h = max(h0, h1, h2) + h3;
             62     tot_w = max(w0 + w1 + w2, w3);
             63     updateAns(tot_w, tot_h);
             64     //3
             65     tot_h = max(max(h0, h1) + h3, h2);
             66     tot_w = max(w0 + w1, w3) + w2;
             67     updateAns(tot_w, tot_h);
             68     //4
             69     tot_h = max(h0 + h1, h2, h3);
             70     tot_w = max(w0, w1) + w2 + w3;
             71     updateAns(tot_w, tot_h);
             72     //5
             73     tot_h = max(h0 + h1, h2 + h3);
             74     tot_w = max(w0 + w3, w1 + w2);
             75     if (h0 + h2 > tot_h && w0 + w2 > tot_w) return;
             76     if (h1 + h3 > tot_h && w1 + w3 > tot_w) return;
             77     updateAns(tot_w, tot_h);
             78 }
             79 
             80 void getPermutation(int x[], int p)
             81 {
             82     if (p >= 4)
             83     {
             84         for (int i = 0; i <= 15; i++)
             85             calcArea(x, i);
             86         return;
             87     }
             88     for (int i = p; i < 4; i++)
             89     {
             90         swap(x[i], x[p]);
             91         getPermutation(x, p + 1);
             92         swap(x[i], x[p]);
             93     }
             94 }
             95 
             96 int main()
             97 {
             98     freopen("packrec.in""r", stdin);
             99     freopen("packrec.out""w", stdout);
            100 
            101     for (int i = 0; i < 4; i++)
            102         cin >> rect[i].w >> rect[i].h;
            103 
            104     int x[4= { 0123 };  //the permutation of 4 rectangles
            105 
            106     getPermutation(x, 0);
            107 
            108     for (int i = 0; i < ans_cnt - 1; i++)
            109         for (int j = i + 1; j < ans_cnt; j++)
            110             if (ans_w[i] > ans_w[j])
            111             {
            112                 swap(ans_w[i], ans_w[j]);
            113                 swap(ans_h[i], ans_h[j]);
            114             }
            115 
            116     cout << ans << endl;
            117     for (int i = 0; i < ans_cnt; i++)
            118         cout << ans_w[i] << ' ' << ans_h[i] << endl;
            119 
            120     return 0;
            121 }
            122 
            欧美精品福利视频一区二区三区久久久精品 | 久久九九青青国产精品| 一级做a爰片久久毛片人呢| 蜜桃麻豆www久久国产精品| 精品久久久久久久中文字幕| 一本久久a久久精品亚洲| 国产精久久一区二区三区| A级毛片无码久久精品免费| 国内精品久久人妻互换| 亚洲精品美女久久久久99| 久久影院久久香蕉国产线看观看| 亚洲性久久久影院| 欧美激情精品久久久久久久| 18岁日韩内射颜射午夜久久成人| 91超碰碰碰碰久久久久久综合| 久久精品中文无码资源站| 中文字幕亚洲综合久久菠萝蜜| 久久久久亚洲AV成人片| 91精品国产综合久久婷婷| 久久精品国产99久久久| 久久伊人色| 国产一区二区精品久久岳| 久久A级毛片免费观看| 久久中文字幕人妻熟av女| 久久天天婷婷五月俺也去| 亚洲欧美一区二区三区久久| 热99re久久国超精品首页| 久久人人爽人人爽人人片av麻烦 | 欧美久久一级内射wwwwww.| 国产精品免费看久久久香蕉| 久久精品中文字幕无码绿巨人| 亚洲国产精品综合久久网络| 91精品国产综合久久香蕉| 久久99国产综合精品免费| 色婷婷综合久久久久中文| 久久国产精品-国产精品| 久久精品国产黑森林| 蜜桃麻豆WWW久久囤产精品| 久久久久人妻一区精品果冻| 国产一区二区三精品久久久无广告 | 尹人香蕉久久99天天拍|