hdu 5128 广州赛B题题解

来源:互联网 发布:网络机顶盒能看卫视吗 编辑:程序博客网 时间:2024/05/21 10:08
#include<stdio.h>#include<iostream>#include<math.h>#include<algorithm>using namespace std;#define eps 1e-8int sig(double x){return (x>eps)-(x<-eps);}struct P{    double x,y;    P(double a=0,double b=0):x(a),y(b){}    P operator +(const P &a)const{        return P(x+a.x,y+a.y);    }    P operator -(const P &a)const{        return P(x-a.x,y-a.y);    }    P operator *(const double a)const{        return P(x*a,y*a);    }    P operator /(const double a)const{        return P(x/a,y/a);    }    double operator *(const P &a)const{        return (x*a.x+y*a.y);    }    double operator ^(const P &a)const{        return (x*a.y-y*a.x);    }    bool on(P a,P b)    {        P v1=a-*this,v2=b-*this;        return sig(v1^v2)==0&&sig(v1*v2)<=0;    }};struct Rec{    P a,b,c,d;    double area;};int seg(P a1,P b1,P a2,P b2){    if(a1.on(a2,b2)||b1.on(a2,b2)||a2.on(a1,b1)||b2.on(a1,b1)) return 1;    return sig((b1-a1)^(b2-a1))*sig((b1-a1)^(a2-a1))<0&&sig((b2-a2)^(b1-a2))*sig((b2-a2)^(a1-a2))<0;}int cmp(P a,P b){    if(sig(a.x-b.x)!=0) return a.x<b.x;    else return a.y<b.y;}int cmp1(Rec a,Rec b){    return a.area>b.area;}int graphm(P *p,int n,P *q){    sort(p,p+n,cmp);    int m=0;    for(int i=0;i<n;i++)    {        while(m>1&&sig((q[m-1]-q[m-2])^(p[i]-q[m-2]))<=0) m--;        q[m++]=p[i];    }    int k=m;    for(int i=n-2;i>=0;i--)    {        while(m>k&&sig((q[m-1]-q[m-2])^(p[i]-q[m-2]))<=0) m--;        q[m++]=p[i];    }    if(n>1) m--;    if(m==4)    {        //cout<<"m="<<m<<endl;        //for(int i=0;i<m;i++) cout<<q[i].x<<"  "<<q[i].y<<endl;        int flag=0;        for(int i=0;i<4;i++)        {            if(sig(q[i].x-q[i+1].x)==0||sig(q[i].y-q[i+1].y)==0) flag++;        }        if(flag==4) return 1;    }    return 0;}int Recjudge(Rec a,Rec b){    int flag=0;    P p[5],q[5];    p[0]=a.a;p[1]=a.b;p[2]=a.c;p[3]=a.d;p[4]=p[0];    q[0]=b.a;q[1]=b.b;q[2]=b.c;q[3]=b.d;q[4]=q[0];    for(int i=0;i<4;i++)    {        for(int j=0;j<4;j++)        {            if(seg(p[i],p[i+1],q[j],q[j+1])==1)            {flag=1;break;}        }        if(flag) break;    }    if(flag) return 0;    return 1;}int Recjudge1(P a,Rec b){    int flag=0;    P p[5];    p[0]=b.a;p[1]=b.b;p[2]=b.c;p[3]=b.d;p[4]=p[0];    for(int i=0;i<4;i++)    {        if(sig((p[i]-a)^(p[i+1]-a))>0) flag++;    }    if(flag==4) return 1;    else return 0;}Rec r[60060];P p[40];int main(){    int n;    while(scanf("%d",&n)!=EOF&&n)    {        int cnt=0;        for(int i=0;i<n;i++)            scanf("%lf%lf",&p[i].x,&p[i].y);        for(int i=0;i<n;i++)        {            for(int j=i+1;j<n;j++)            {                for(int k=j+1;k<n;k++)                {                    for(int t=k+1;t<n;t++)                    {                        P ch1[6],ch2[6];                        ch1[0]=p[i];ch1[1]=p[j];ch1[2]=p[k];ch1[3]=p[t];                        if(graphm(ch1,4,ch2)==1)                        {                            r[cnt].a=ch2[0];r[cnt].b=ch2[1];r[cnt].c=ch2[2];r[cnt].d=ch2[3];                            r[cnt].area=fabs((ch2[0]-ch2[1])^(ch2[2]-ch2[1]));                            cout<<r[cnt].area<<endl;                            cnt++;                        }                    }                }            }        }        cout<<"cnt="<<cnt<<endl;        sort(r,r+cnt,cmp1);        double ma=0;        for(int i=0;i<cnt;i++)        {            for(int j=i+1;j<cnt;j++)            {                if(Recjudge(r[i],r[j])==1)                {                    int flag=0;                    if(Recjudge1(r[i].a,r[j])==1)                    {                        flag=1;                    }                    if(Recjudge1(r[j].a,r[i])==1)                    {                        flag=1;                    }                    if(flag)                    {                        double area=max(r[i].area,r[j].area);                        if(ma<area) ma=area;                    }                    else                    {                        ma=max(ma,r[i].area+r[j].area);                    }                }            }        }        if(sig(ma)==0) printf("imp\n");        else printf("%.0lf\n",ma);    }}


水题,可惜当时赛场上wa了无数发都没过,太伤心了,主要是当时思路很混乱,代码能力还是太弱啊,任取4点,枚举是否是平行于x轴的矩形,如果是,保留并算出面积

然后枚举矩形,如果不相交并且不包含,则求二者面积之和,如果包含,则算大矩形的面积,最后取最大值

0 0
原创粉丝点击