首页 > 代码库 > poj3334Connected Gheeves(二分)

poj3334Connected Gheeves(二分)

链接

二分高度,算面积的地方有点麻烦,没有用求交点的模板,直接自己按三角形相似手算了一下,写的有点麻烦。

上下界直接取水可放的最高点以及最低点。

自己的长得很挫的代码

  1 #include <iostream>  2 #include<cstdio>  3 #include<cstring>  4 #include<algorithm>  5 #include<stdlib.h>  6 #include<vector>  7 #include<cmath>  8 #include<queue>  9 #include<set> 10 using namespace std; 11 #define N 2010 12 #define LL long long 13 #define INF 0xfffffff 14 const double eps = 1e-8; 15 const double pi = acos(-1.0); 16 const double inf = ~0u>>2; 17 struct point 18 { 19     double x ,y; 20     point(double x=0,double y=0):x(x),y(y){} 21 }p[N],q[N],ch[N]; 22 double minz; 23 int n,m; 24 typedef point pointt; 25 pointt operator -(point a,point b) 26 { 27     return point(a.x-b.x,a.y-b.y); 28 } 29 int dcmp(double x) 30 { 31     if(fabs(x)<eps) return 0; 32     return x<0?-1:1; 33 } 34 double dis(point a) 35 { 36     return sqrt(a.x*a.x+a.y*a.y); 37 } 38 double cross(point a,point b) 39 { 40     return a.x*b.y-a.y*b.x; 41 } 42 double getarea(int n,point p[]) 43 { 44     int i; 45     double s = 0; 46     for(i = 2; i < n ; i++) 47     s+=cross(p[i]-p[1],p[i+1]-p[1]); 48     return s/2; 49 } 50 double cal(double r,point p[],int n) 51 { 52     int i,j; 53     int k = 1; 54     for(i = 1; i <= n; i++) 55     if(p[i].y<p[k].y)    k = i; 56  57     if(dcmp(r-p[k].y)<=0) return 0.0; 58  59     point p1,p2; 60     int g = 0; 61     for(i = 1; i < k; i++) 62     if(dcmp(p[i].y-r)>=0&&dcmp(p[i+1].y-r)<0) 63     { 64         p1.y = r; 65         double d = r-p[i+1].y; 66         p1.x = d*(p[i].x-p[i+1].x)/(p[i].y-p[i+1].y)+p[i+1].x; 67         break; 68     } 69  70     for(j = k ; j >= i+1; j--) 71     ch[++g] = p[j]; 72     ch[++g] = p1; 73     for(i = k+1 ; i <= n; i++) 74     if(dcmp(p[i-1].y-r)<0&&dcmp(p[i].y-r)>=0) 75     { 76         p2.y = r; 77         double d = r-p[i-1].y; 78         p2.x = d*(p[i].x-p[i-1].x)/(p[i].y-p[i-1].y)+p[i-1].x; 79         break; 80     } 81     ch[++g] = p2; 82     for(j = i-1 ; j > k; j--) 83     ch[++g] = p[j]; 84  85     return fabs(getarea(g,ch)); 86 } 87 int main() 88 { 89     int t,i,a; 90     cin>>t; 91     while(t--) 92     { 93         scanf("%d",&a); 94         scanf("%d",&n); 95         minz = INF; 96         double maxz  = INF; 97         for(i = 1; i <= n ;i++) 98         { 99             scanf("%lf%lf",&p[i].x,&p[i].y);100             maxz = min(maxz,p[i].y);101         }102         scanf("%d",&m);103         for(i = 1; i <= m ;i++)104         {105             scanf("%lf%lf",&q[i].x,&q[i].y);106             maxz = min(maxz,p[i].y);107         }108         minz = min(min(p[1].y,p[n].y),min(q[1].y,q[m].y));109         double lef = maxz,rig = minz,mid;110         while(fabs(rig-lef)>eps)111         {112             mid = (rig+lef)/2.0;113             double s1 = cal(mid,p,n),s2 = cal(mid,q,m);114             if(dcmp(s1+s2-a)>0)115             rig = mid;116             else lef = mid;117         }118         printf("%.3f\n",lef);119     }120     return 0;121 }
View Code

感觉不错的别人的代码

  1 #include <iostream>  2 #include<cstdio>  3 #include<cstring>  4 #include<algorithm>  5 #include<stdlib.h>  6 #include<vector>  7 #include<cmath>  8 #include<queue>  9 #include<set> 10 using namespace std; 11 #define N 2010 12 #define LL long long 13 #define INF 0xfffffff 14 const double eps = 1e-8; 15 const double pi = acos(-1.0); 16 const double inf = ~0u>>2; 17 struct point 18 { 19     double x ,y; 20     point(double x=0,double y=0):x(x),y(y){} 21 }p[N],q[N],ch[N]; 22 double minz; 23 typedef point pointt; 24 pointt operator -(point a,point b) 25 { 26     return point(a.x-b.x,a.y-b.y); 27 } 28 int dcmp(double x) 29 { 30     if(fabs(x)<eps) return 0; 31     return x<0?-1:1; 32 } 33 double dis(point a) 34 { 35     return sqrt(a.x*a.x+a.y*a.y); 36 } 37 double cross(point a,point b) 38 { 39     return a.x*b.y-a.y*b.x; 40 } 41  42 double getarea(int n,point p[]) 43 { 44     int i; 45     double s = 0; 46     for(i = 1; i < n-1 ; i++) 47     s+=cross(p[i]-p[0],p[i+1]-p[0]); 48     return s/2; 49 } 50 //double cal(double r,point p[],int n) 51 //{ 52 //    int i,j; 53 //    int k = 1; 54 //    for(i = 1; i <= n; i++) 55 //    if(p[i].y<p[k].y)    k = i; 56 // 57 //    r = min(r,minz); 58 //    if(dcmp(r-p[k].y)<=0) return 0.0; 59 // 60 //    point p1,p2; 61 //    int g = 0; 62 //    for(i = 1; i < k; i++) 63 //    if(dcmp(p[i].y-r)>=0&&dcmp(p[i+1].y-r)<0) 64 //    { 65 //        p1.y = r; 66 //        double d = r-p[i+1].y; 67 //        p1.x = d*(p[i].x-p[i+1].x)/(p[i].y-p[i+1].y)+p[i+1].x; 68 //        break; 69 //    } 70 //   // cout<<p1.x<<" "<<p1.y<<endl; 71 //    for(j = k ; j >= i+1; j--) 72 //    ch[++g] = p[j]; 73 //    ch[++g] = p1; 74 //    for(i = k+1 ; i <= n; i++) 75 //    if(dcmp(p[i-1].y-r)<0&&dcmp(p[i].y-r)>=0) 76 //    { 77 //        p2.y = r; 78 //        double d = r-p[i-1].y; 79 //        p2.x = d*(p[i].x-p[i-1].x)/(p[i].y-p[i-1].y)+p[i-1].x; 80 //        break; 81 //    } 82 //    ch[++g] = p2; 83 //    for(j = i-1 ; j > k; j--) 84 //    ch[++g] = p[j]; 85 // 86 //    return fabs(getarea(g,ch)); 87 //} 88 point intersect(point p1,point p2,point p3,point p4){ 89     point p; 90     double a1,b1,a2,b2,c1,c2,d; 91     a1=p1.y-p2.y; b1=p2.x-p1.x; c1=p1.x*p2.y-p2.x*p1.y; 92     a2=p3.y-p4.y; b2=p4.x-p3.x; c2=p3.x*p4.x-p4.x*p3.y; 93     d=a1*b2-a2*b1; 94     p.x=(-c1*b2+c2*b1)/d; 95     p.y=(-a1*c2+a2*c1)/d; 96     return p; 97 } 98 bool pan(point a,point b,double y){ 99     return dcmp(a.y-y)*dcmp(b.y-y)<=0;100 }101 double cal(double y,point P[],int n){102 103     int i,j,k;104    int tot=0;105     point a=point(0,y),b=point(1,y);106     for(i=1;i<n;i++){107         if(pan(P[i],P[i+1],y)){108             ch[tot++]=intersect(P[i],P[i+1],a,b);109             break;110         }111     }112     for(j=i+1;j<n;j++){113         ch[tot++]=P[j];114         if(pan(P[j],P[j+1],y)){115             ch[tot++]=intersect(P[j],P[j+1],a,b);116             break;117         }118     }119     double area=getarea(tot,ch);120     return area;121 }122 int main()123 {124     int t,i,a,n,m;125     cin>>t;126     while(t--)127     {128         scanf("%d",&a);129         scanf("%d",&n);130         minz = INF;131         for(i = 1; i <= n ;i++)132         {133             scanf("%lf%lf",&p[i].x,&p[i].y);134             minz = min(minz,p[i].y);135         }136         scanf("%d",&m);137         for(i = 1; i <= m ;i++)138         {139             scanf("%lf%lf",&q[i].x,&q[i].y);140             minz = min(minz,q[i].y);141         }142         double maxz = min(min(p[1].y,p[n].y),min(q[1].y,q[m].y));143         double lef = minz,rig = maxz,mid;144         while(fabs(rig-lef)>eps)145         {146             mid = (rig+lef)/2.0;147             double s1 = cal(mid,p,n),s2 = cal(mid,q,m);148             if(dcmp(s1+s2-a)>0)149             rig = mid;150             else lef = mid;151         }152         printf("%.3f\n",lef);153     }154     return 0;155 }
View Code