USACO Packing Rectangles

来源:互联网 发布:上瘾网络剧新闻发布会 编辑:程序博客网 时间:2024/06/07 16:44

/*LANG: C++TASK: packrec*/#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <vector>#include <map>#include <algorithm>#include <iostream>#include <ctime>#include <string>#include <numeric>using namespace std;#define N 25#define M 8005int pl[50][5],num,rec[5][3],Min,Count;struct rect1{    int p,q;}ans[M];void init(){    num=0;    for (int i=1;i<=4;i++)    for (int j=1;j<=4;j++)    if (i!=j)    for (int k=1;k<=4;k++)    if (k!=i && k!=j)    {        int t=10-i-j-k;        num++;        pl[num][1]=i;        pl[num][2]=j;        pl[num][3]=k;        pl[num][4]=t;    }    for (int i=1;i<=4;i++) scanf("%d%d",&rec[i][1],&rec[i][2]);}int Max(int a,int b,int c,int d){    int ans=a;    if (b>ans) ans=b;    if (c>ans) ans=c;    if (d>ans) ans=d;    return ans;}void check(int a,int b){    if (a>b)    {        int c=a;        a=b;        b=c;    }    if (a*b<Min)    {        Min=a*b;        Count=1;        ans[1].p=a;        ans[1].q=b;    }    else if (a*b==Min)    {        //cout<<"*******";        Count++;        ans[Count].p=a;        ans[Count].q=b;    }}bool cmp(const struct rect1 &a,const struct rect1 &b){    return a.p<b.p;}int main(){    freopen("packrec.in","r",stdin);freopen("packrec.out","w",stdout);    //freopen("a.txt","r",stdin);    init();    Min=40005;    for (int i=1;i<=num;i++)    {        int a,b,c,d;        a=pl[i][1];b=pl[i][2];c=pl[i][3];d=pl[i][4];        for (int i1=1;i1<=2;i1++)        for (int i2=1;i2<=2;i2++)        for (int i3=1;i3<=2;i3++)        for (int i4=1;i4<=2;i4++)        {            int a1=rec[a][i1],a2=rec[a][3-i1];            int b1=rec[b][i2],b2=rec[b][3-i2];            int c1=rec[c][i3],c2=rec[c][3-i3];            int d1=rec[d][i4],d2=rec[d][3-i4];            int wide,leng;            wide=a2+b2+c2+d2;            leng=Max(a1,b1,c1,d1);            check(wide,leng);            wide=max(d1,a2+b2+c2);            leng=Max(a1,b1,c1,0)+d2;            check(wide,leng);            wide=max(d1,a2+b2)+c2;            leng=max( max(a1,b1)+d2 ,c1);            check(wide,leng);            wide=a2+max(b2,c2)+d2;            leng=Max(a1,b1+c1,d1,0);            check(wide,leng);            wide=max(b2+c2,a2+d2);            leng=max(a1,d1)+max(b1,c1);            if (a1+b1<leng && c1+d1<leng && (a2<=b2 && b1<=c1 || d2<=c2 && b1>=c1))            leng-=min(leng-a1-b1,leng-c1-d1);            check(wide,leng);//            wide=max(a2,b2)+max(c2,d2);//            leng=max(a1+b1,c1+d1);//            check(wide,leng);        }    }    sort(ans+1,ans+Count+1,cmp);    ans[0].p=-2;    printf("%d\n",Min);    for (int i=1;i<=Count;i++)    if (ans[i].p!=ans[i-1].p) printf("%d %d\n",ans[i].p,ans[i].q);    return 0;}

http://www.nocow.cn/index.php/Translate:USACO/packrec


最后一种情况不太好写,我是把上面两个先并一起,下面两个再并一起,然后看看这两个大的之间能不能压缩。



原创粉丝点击