poj Fishnet

http://poj.org/problem?id=1408

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<algorithm>
  5 #define maxn 1000
  6 using namespace std;
  7 
  8 const double eps=1e-8;
  9 const double pi=acos(-1.0);
 10 
 11 int cmp(double x)
 12 {
 13     if(fabs(x)<eps) return 0;
 14     if(x>0) return 1;
 15     return -1;
 16 }
 17 
 18 struct point
 19 {
 20     double x,y;
 21     point(){}
 22     point(double a,double b):x(a),y(b) {}
 23     friend point operator -(const point &a,const point &b){
 24         return point(a.x-b.x,a.y-b.y);
 25     }
 26     friend point operator * (const point &a,const double b)
 27     {
 28         return point (a.x*b,a.y*b);
 29     }
 30     friend point operator / (const point &a,const double b)
 31     {
 32         return point(a.x/b,a.y/b);
 33     }
 34 };
 35 struct line
 36 {
 37     point a,b;
 38     line(){}
 39     line(point x,point y):a(x),b(y){}
 40 };
 41 inline double sqr(double x)
 42 {
 43     return x*x;
 44 }
 45 double det(point a,point b)
 46 {
 47     return a.x*b.y-a.y*b.x;
 48 }
 49 double dot(point a,point b)
 50 {
 51     return a.x*b.x+a.y*b.y;
 52 }
 53 double dist(point a,point b)
 54 {
 55     return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
 56 }
 57 double area(point a[])
 58 {
 59     double sum=0;
 60     a[4]=a[0];
 61     for(int i=0; i<4; i++)
 62     {
 63         sum+=det(a[i+1],a[i]);
 64     }
 65     return sum/2;
 66 }
 67 
 68 bool parallel (line a,line b)
 69 {
 70     return !cmp(det(a.a-a.b,b.a-b.b));
 71 }
 72 
 73 bool line_make_point(line a,line b,point &res)
 74 {
 75     if(parallel(a,b)) return false;
 76     double s1=det(a.a-b.a,b.b-b.a);
 77     double s2=det(a.b-b.a,b.b-b.a);
 78     res=(a.b*s1-a.a*s2)/(s1-s2);
 79     return true;
 80 }
 81 
 82 int main()
 83 {
 84    int n;
 85    double a[maxn],b[maxn],c[maxn],d[maxn];
 86    point m[110][110];
 87    line l[110][110];
 88    while(scanf("%d",&n)&&n){
 89        double max1=eps;
 90         for(int i=1; i<=n; i++){
 91            scanf("%lf",&a[i]);
 92            m[0][i].x=a[i];
 93            m[0][i].y=0;
 94 
 95         }
 96         m[0][0].x=0;
 97         m[0][0].y=0;
 98         m[0][n+1].x=1;
 99         m[0][n+1].y=0;
100         for(int j=1; j<=n; j++){
101            scanf("%lf",&b[j]);
102            m[n+1][j].x=b[j];
103            m[n+1][j].y=1;
104         }
105         m[n+1][0].x=0;
106         m[n+1][0].y=1;
107         m[n+1][n+1].x=1;
108         m[n+1][n+1].y=1;
109         for(int k=1; k<=n; k++){
110            scanf("%lf",&c[k]);
111            m[k][0].y=c[k];
112            m[k][0].x=0;
113         }
114         for(int t=1 ; t<=n; t++){
115            scanf("%lf",&d[t]);
116            m[t][n+1].x=1;
117            m[t][n+1].y=d[t];
118         }
119         for(int i=1; i<=n; i++)
120         {
121             l[i][0].a=m[0][i];
122             l[i][0].b=m[n+1][i];
123         }
124         for(int i=1; i<=n; i++)
125         {
126             l[0][i].a=m[i][0];
127             l[0][i].b=m[i][n+1];
128         }
129         for(int i=1; i<=n; i++)
130         {
131             for(int j=1; j<=n; j++)
132             {
133                 point res;
134                 line_make_point(l[0][i],l[j][0],res);
135                 m[i][j]=res;
136             }
137         }
138         for(int i=0; i<=n+1; i++)
139         {
140             for(int j=0; j<=n+1; j++)
141             {
142                 point s[110];
143                 s[3]=m[i-1][j-1];
144                 s[2]=m[i-1][j];
145                 s[1]=m[i][j];
146                 s[0]=m[i][j-1];
147                 max1=max(max1,area(s));
148                 //printf("%.6lf ",area(s));
149             }
150             //printf("\n");
151         }
152         printf("%.6lf\n",max1);
153    }
154    return 0;
155 }
View Code

 

转载于:https://www.cnblogs.com/fanminghui/p/3369198.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值