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
",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
",lef);
153     }
154     return 0;
155 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3895872.html