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
- hdu 5128 广州赛B题题解
- HDU 5023 A Corrupt Mayor's Performance Art(广州网络赛B题)
- 2014ACM广州赛区现场赛J题题解.
- HDU-5135 广州现场赛题
- HDU 4771 Stealing Harry Potter's Precious 2013亚洲区域赛杭州赛区 B 题题解
- HDU 3652 B-number 题解(数位DP模板题)
- Hdu 3652 数位DP B-number题解
- 2013 ACM/ICPC 长沙网络赛B题解题报告
- HDU 5128 The E-pang Palace (排序+暴力)2014 ICPC 广州站现场赛
- HDU 5128 The E-pang Palace(2014亚洲区广州站现场赛)
- 2014广州亚洲现场赛/hdu 5128 The E-pang Palace(计算几何:暴力枚举)
- HDU 1867 A + B for you again KMP题解
- hdu 1228 A + B 详细题解 字符串/哈希
- HDU 5024 Wang Xifeng's Little Plot(广州网络赛C题)
- HDU 5025 Saving Tang Monk(广州网络赛D题)
- HDU 5029 Relief grain (2014年广州赛区网络赛H题)
- HDU 5130 Signal Interference (2014年广州赛区现场赛D题)
- HDU 5135 Little Zu Chongzhi's Triangles (2014年广州赛区现场赛I题)
- Apache配置虚拟主机
- 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包
- 7.1.1 使用 F# 记录类型
- Vuforia Virtual Button(虚拟按钮)案例一——按钮位置计算
- c编程:输入一个字符串,求出字符串的最后一个字符,如果是空字符串则返回空字符。
- hdu 5128 广州赛B题题解
- Vuforia Virtual Button(虚拟按钮)案例二——按钮事件处理
- linux下静态库与共享库的生成和使用
- 算法--计算两个绝对路径之间的相对路径
- 每个Java开发者都应该知道的5个JDK工具
- 从字节码角度看String的连接操作
- Longest Increasing Subsequence Show Result My Submissions
- IO流 FileInputStream(字节流) FileReader(字符流能打印出中文)把文件中内容读出来
- 用Swift写个Material Design组件库