标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 240 Accepted Submission(s): 99
题解:中间找x点坐标还没理解,中间判断相交,以及与上下管道相交处理的很巧妙;
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; struct Node{ double x,y; }; Node point[30][2]; double chaji(Node a,Node b,Node c){ return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x); } double is_intersection(Node a,Node b,Node c,Node d){ return chaji(a,b,c)*chaji(a,b,d); } double area(Node a,Node b,Node c){ double ab,bc,ac; ab=sqrt(1.0*pow(b.x-a.x,2)+pow(b.y-a.y,2)); ac=sqrt(1.0*pow(c.x-a.x,2)+pow(c.y-a.y,2)); bc=sqrt(1.0*pow(c.x-b.x,2)+pow(c.y-b.y,2)); double p=(ab+bc+ac)/2.0;// /2 return sqrt(p*(p-ac)*(p-ab)*(p-bc)); } double getx(Node a,Node b,Node c,Node d){ double s1=area(a,b,c),s2=area(a,b,d); return (s1*d.x+s2*c.x)/(s1+s2);//找x坐标,没理解太清; } int main(){ int n; while(scanf("%d",&n),n){ for(int i=0;i<n;i++){ scanf("%lf%lf",&point[i][0].x,&point[i][0].y); point[i][1].x=point[i][0].x; point[i][1].y=point[i][0].y-1; } Node s_1=point[0][0],s_2=point[0][1],a,b; double ans=-INF; int flot=0; for(int q=0;q<n;q++){ for(int w=0;w<2;w++){ a=point[q][w]; for(int e=q+1;e<n;e++){ for(int r=0;r<2;r++){ b=point[e][r]; if(is_intersection(a,b,s_1,s_2)<=0){ int t; for(t=1;t<n;t++){ if(is_intersection(a,b,point[t][0],point[t][1])>0){ double x; if(chaji(a,b,point[t][0])>0) x=getx(a,b,point[t-1][1],point[t][1]); else x=getx(a,b,point[t-1][0],point[t][0]); ans=max(ans,x); break; } } if(t==n)flot=1; } } } } } if(flot)puts("Through all the pipe."); else printf("%.2f\n",ans); } return 0; }
hdoj Pipe&&南阳oj管道问题&&poj1039(计算几何问题...枚举)
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/4931606.html