USACO 1.4 Packing Rectangles(模拟)

这个题,不简单啊,虽说是模拟,但是需要注意的情况有很多。开始看错了题,理解正确题意之后,依旧写了很久,错了N次后,终于到了最后一组数据,终于给水过去了,最后一种情况我是分两种情况讨论的,也不知写的对不对。。。

  1 /*
  2  ID: cuizhe
  3  LANG: C++
  4  TASK: packrec
  5 */
  6 #include <iostream>
  7 #include <cstdio>
  8 #include <cstring>
  9 #include <cstdlib>
 10 #include <map>
 11 #include <algorithm>
 12 using namespace std;
 13 int px[5],py[5],k[5];
 14 int o[100001],ans,num,sum,temp;
 15 void cl()
 16 {
 17 
 18     if(ans > sum*temp)
 19     {
 20         ans = sum*temp;
 21         memset(o,0,sizeof(o));
 22         o[min(sum,temp)] = 1;
 23     }
 24     else if(ans == sum*temp)
 25     {
 26         o[min(sum,temp)] = 1;
 27     }
 28 }
 29 void dfs(int x)
 30 {
 31     int i,j;
 32     int mx[5],my[5];
 33     if(x > 4)
 34     {
 35         for(i = 0; i < 1<<4; i ++)
 36         {
 37             for(j = 0; j <= 3; j ++)
 38             {
 39                 if(i&(1<<j))
 40                 {
 41                     mx[j] = px[k[j+1]];
 42                     my[j] = py[k[j+1]];
 43                 }
 44                 else
 45                 {
 46                     my[j] = px[k[j+1]];
 47                     mx[j] = py[k[j+1]];
 48                 }
 49             }
 50             sum = my[0]+my[1]+my[2]+my[3];//方法1
 51             temp = mx[0];
 52             for(j = 1; j <= 3; j ++)
 53             {
 54                 temp = max(mx[j],temp);
 55             }
 56             cl();
 57             sum = max(my[0]+my[1]+my[2],my[3]);//方法2
 58             temp = mx[0];
 59             for(j = 1; j <= 2; j ++)
 60             {
 61                 temp = max(mx[j],temp);
 62             }
 63             temp += mx[3];
 64             cl();
 65             sum = max(my[0]+my[1],my[3]);//方法3
 66             sum += my[2];
 67             temp = mx[2];
 68             temp = max(temp,mx[0]+mx[3]);
 69             temp = max(temp,mx[1]+mx[3]);
 70             cl();
 71             sum = my[0]+max(my[1],my[2])+my[3];//方法4
 72             temp = mx[0];
 73             temp = max(mx[1]+mx[2],temp);
 74             temp = max(temp,mx[3]);
 75             cl();
 76             sum = my[2]+max(my[0],my[1])+my[3];//方法5
 77             temp = mx[2];
 78             temp = max(mx[0]+mx[1],temp);
 79             temp = max(temp,mx[3]);
 80             cl();
 81             sum =  max(mx[0],mx[1])+max(mx[2],mx[3]);//方法6分2种情况
 82             temp = max(my[0]+my[1],my[2]+my[3]);
 83             cl();
 84             if(my[0]+my[1] >= my[2]+my[3])
 85             {
 86                 sum = my[0]+my[1];
 87                 if(my[3] > my[1])
 88                 {
 89                     temp = max(mx[3]+max(mx[0],mx[1]),mx[2]+mx[0]);
 90                     cl();
 91                 }
 92                 else if(my[2] > my[0])
 93                 {
 94                     temp = max(mx[2]+max(mx[0],mx[1]),mx[3]+mx[1]);
 95                     cl();
 96                 }
 97             }
 98         }
 99     }
100     for(i = 1; i <= 4; i ++)
101     {
102         if(!k[i])
103         {
104             k[i] = x;
105             dfs(x+1);
106             k[i] = 0;
107         }
108     }
109 
110 }
111 int main()
112 {
113     int i,t;
114     freopen("packrec.in","r",stdin);
115     freopen("packrec.out","w",stdout);
116     for(i = 1; i <= 4; i ++)
117     {
118         scanf("%d%d",&px[i],&py[i]);
119         if(px[i] > py[i])
120         {
121             t = px[i];
122             px[i] = py[i];
123             py[i] = t;
124         }
125     }
126     ans = 10000000;
127     dfs(1);
128     printf("%d\n",ans);
129     for(i = 1; i <= 100000; i ++)
130     {
131         if(o[i])
132             printf("%d %d\n",i,ans/i);
133     }
134     return 0;
135 }
136 /*
137 4 5
138 4 5
139 4 5
140 1 16
141 */
posted @ 2012-10-24 21:26  Naix_x  阅读(203)  评论(0编辑  收藏  举报