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