acdreamoj 1106 游泳水平有限的瑶瑶
2014-06-15 11:15
387 查看
游泳水平有限的瑶瑶
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/128000 KB (Java/Others)SubmitStatistic Next
Problem
Problem Description
唉!命运啊!天生聪颖的瑶瑶乘坐的船不幸遇上了风暴,由于年久失修而沉没了。瑶瑶乘着救生艇飘到了一座小岛上。她飘了一天一夜,又饿又累,这时他发现相邻的一座岛上有果树,于是她决定去那一座岛上摘果子吃。不幸的是救生艇已经损坏了,他只能靠游泳过去。为了尽量节省体力,tsyao想找一条尽量短的路径游过去。假设这两座岛都是凸多边形,你能计算出瑶瑶最小要游的距离吗。
Input
第一行一个正整数n,表示第一座岛的顶点个数,接下来n对顶点按逆时针顺序给出这些顶点,每行两个数x,y表示一个顶点的坐标。接下来一个正整数m,表示第二座岛的顶点个数,接下来m对顶点按逆时针顺序给出这些顶点,每行两个数x,y表示一个顶点的坐标
Output
输出最小游泳距离,保留4为小数
Sample Input
3 1 0 0 1 0 0 4 1 1 3 1 3 2 1 2
Sample Output
0.7071
Hint
对于100%的数据,n,m<=1000。数据保证给出的两个凸多边形没有重叠单组输入,共10组数据。
求点到线段的距离..
#include <stdio.h> #include <string.h> #include <vector> #include <map> #include <math.h> #include <queue> #include <algorithm> using namespace std; typedef long long ll; #define rep(i,s,t) for(int i=s;i<t;i++) #define red(i,s,t) for(int i=s-1;i>=t;i--) #define ree(i,now) for(int i=head[now];i!=-1;i=edge[i].next) #define clr(a,v) memset(a,v,sizeof a) #define INF 201000100 #define PI acos(-1.0) #define eps 1e-6 struct point{ double x,y; }a[1010],b[1010]; inline double dis(point a,point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } inline double angle(point a,point b,point c){ double l1=dis(a,b); double l2=dis(a,c); double l3=dis(b,c); return acos((l1*l1+l2*l2-l3*l3)/(2*l1*l2)); } inline double dis(point a,point b,point c){ double ang=angle(b,a,c); if(ang<(PI/2) || fabs(ang-PI/2)<eps){ double l1=dis(a,b); double l2=dis(b,c); double ll=l1*cos(ang); if(ll<l2 || fabs(ll-l2)<eps) return l1*sin(ang); else return min(dis(a,b),dis(a,c)); } else{ ang=angle(c,a,b); double l1=dis(a,c); double l2=dis(b,c); double ll=l1*cos(ang); if(ll<l2 || fabs(ll-l2)<eps) return l1*sin(ang); else return min(dis(a,b),dis(a,c)); } } int n,m; int main(){ while(~scanf("%d",&n)){ rep(i,0,n) scanf("%lf%lf",&a[i].x,&a[i].y); scanf("%d",&m); rep(i,0,m) scanf("%lf%lf",&b[i].x,&b[i].y); double ans=-1; rep(i,0,n) rep(j,0,m){ int x=j+1; if(x>=m) x-=m; double M=dis(a[i],b[j],b[x]); if(ans==-1 || ans>M) ans=M; } rep(j,0,m) rep(i,0,n){ int x=i+1; if(x>=n) x-=n; double M=dis(b[j],a[i],a[x]); if(ans==-1 || ans>M) ans=M; } printf("%.4lf\n",ans); } return 0; }
相关文章推荐
- ACdream 1106 游泳水平有限的瑶瑶 (计算几何)(点到直线的最短距离)
- acdream oj 1101 瑶瑶想要玩滑梯
- acdream oj 1105 瑶瑶带你玩激光坦克
- acdreamoj 瑶瑶饿了 完全背包
- ACdream OJ 1099 瑶瑶的第K大 --分治+IO优化
- ACdream OJ 1099 瑶瑶的第K大 --分治+IO优化 - whatbeg
- ACdream OJ 1099 瑶瑶的第K大
- 【ACdream OJ 1099 - 瑶瑶的第K大 (输入优化+手写O(n)快排)】
- acdreamoj 1211 有上下界的网络流
- ACdream oj 1212 New Year Bonus Grant(贪心+拓扑排序)
- ACDREAM 02B 瑶瑶带你玩激光坦克(暴力专场)
- ACdream OJ 完美数
- Acdreamoj1115(数学思维题)
- ACdream OJ 平衡树(二进制字典树)
- ACdreamoj1110(多重背包)
- ACdreamoj 1011(树状数组维护字符串hash前缀和)
- ACdream OJ sgx和路飞 (二分答案+数位统计)
- 一道超级坑爹的水题(ACdream oj 无耻的出题人)
- 一道超级坑爹的水题(ACdream oj 无耻的出题人)
- ACdreamOJ 1154 Lowbit Sum (数字dp)