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 */

你可能感兴趣的:(USACO)