您的位置:首页 > 其它

USACO Section 1.4 Packing Rectangles

2014-01-17 19:15 393 查看
题意:

已知4个矩形的l和w  矩形可以旋转和平移  用一块最小面积的新的矩形覆盖4个矩形

求最小的面积  以及新矩形的l和w

思路:

题目已经给出6种摆放方式  按它的方式摆即可

我们要枚举4个矩形是否旋转(只转90度)过  然后枚举每种摆放方式中矩形的编号

代码中的枚举方法是二进制枚举旋转  全排列枚举编号

最后计算所有情况中的答案

第6种摆放方式比较难想  大致思路就是  先放下面两块  在根据下面两块的高度分别讨论上面两块如何摆放

/*
ID: housera1
PROG: packrec
LANG: C++
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct rectangle
{
int l,w;
}f[5];
pair<int,int> sol[5005];
int n,ans=2147483640;
int order[5];

int main(){
int Debug=0;
if(!Debug){
freopen("packrec.in","r",stdin);
freopen("packrec.out","w",stdout);
}
int i,j,x,y;
for(i=0;i<4;i++) scanf("%d%d",&f[i].l,&f[i].w);
for(i=0,n=0;i<16;i++)
{
for(j=0;j<4;j++) if(i&(1<<j)) swap(f[j].l,f[j].w);
for(j=0;j<4;j++) order[j]=j;
do
{
x=f[order[0]].w+f[order[1]].w+f[order[2]].w+f[order[3]].w;
y=max(f[order[0]].l,max(f[order[1]].l,max(f[order[2]].l,f[order[3]].l)));
if(x*y<=ans)
{
if(x*y<ans) n=0,ans=x*y;
if(x>y) swap(x,y);
sol[n++]=make_pair(x,y);
}
x=max(f[order[0]].w,f[order[1]].w+f[order[2]].w+f[order[3]].w);
y=f[order[0]].l+max(f[order[1]].l,max(f[order[2]].l,f[order[3]].l));
if(x*y<=ans)
{
if(x*y<ans) n=0,ans=x*y;
if(x>y) swap(x,y);
sol[n++]=make_pair(x,y);
}
x=max(f[order[0]].w,f[order[1]].w+f[order[2]].w)+f[order[3]].w;
y=max(f[order[0]].l+max(f[order[1]].l,f[order[2]].l),f[order[3]].l);
if(x*y<=ans)
{
if(x*y<ans) n=0,ans=x*y;
if(x>y) swap(x,y);
sol[n++]=make_pair(x,y);
}
x=f[order[0]].w+max(f[order[1]].w,f[order[2]].w)+f[order[3]].w;
y=max(f[order[0]].l,max(f[order[1]].l+f[order[2]].l,f[order[3]].l));
if(x*y<=ans)
{
if(x*y<ans) n=0,ans=x*y;
if(x>y) swap(x,y);
sol[n++]=make_pair(x,y);
}
x=max(f[order[0]].w,f[order[1]].w)+f[order[2]].w+f[order[3]].w;
y=max(f[order[0]].l+f[order[1]].l,max(f[order[2]].l,f[order[3]].l));
if(x*y<=ans)
{
if(x*y<ans) n=0,ans=x*y;
if(x>y) swap(x,y);
sol[n++]=make_pair(x,y);
}
if(f[order[1]].l==f[order[2]].l) x=max(f[order[1]].w+f[order[2]].w,f[order[0]].w+f[order[3]].w);
else if(f[order[1]].l<f[order[2]].l) x=max(f[order[1]].w+f[order[2]].w,f[order[0]].w+max(f[order[2]].w,f[order[3]].w));
else if(f[order[1]].l>f[order[2]].l) x=max(f[order[1]].w+f[order[2]].w,f[order[3]].w+max(f[order[0]].w,f[order[1]].w));
y=max(f[order[0]].l+f[order[1]].l,f[order[2]].l+f[order[3]].l);
if(x*y<=ans)
{
if(x*y<ans) n=0,ans=x*y;
if(x>y) swap(x,y);
sol[n++]=make_pair(x,y);
}
}while(next_permutation(order,order+4));
for(j=0;j<4;j++) if(i&(1<<j)) swap(f[j].l,f[j].w);
}
printf("%d\n",ans);
sort(sol,sol+n);
for(i=0;i<n;i++)
{
if(i!=0&&sol[i].first==sol[i-1].first&&sol[i].second==sol[i-1].second) continue;
printf("%d %d\n",sol[i].first,sol[i].second);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: