hdu 5128 广州赛B题题解

#include<stdio.h>
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
#define eps 1e-8
int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值