标签:bsp www. .com blank 输出 i++ std void test
https://www.nowcoder.com/acm/contest/201/L
第一行五个正整数 n,A,B,C1
,C2
(1≤ n ≤ 1000, -10000 ≤ A,B,C1
,C2
≤ 10000),其中 A,B 不同时为 0。
接下来 n 行每行三个整数 x,y,r(-10000 ≤ x,y ≤ 10000, 1≤ r ≤ 10000) 表示一个圆心为 (x,y),半径为 r 的圆。
仅一行一个实数表示答案。与正确结果的绝对误差或者相对误差不超过 10-4
即算正确。
2 0 1 0 -4 0 1 1 1 3 1
0.236068
可以把圆看成一个点,利用点到直线的距离公式和点到点的距离公式,求出各个点之间的距离,跑一遍最短路即可
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<stack> 6 #include<algorithm> 7 #include<cmath> 8 #define PI acos(-1.0) 9 #define INF 0x3f3f3f3f 10 using namespace std; 11 12 int n; 13 double A,B,C1,C2; 14 struct Circle{ 15 double x,y,r; 16 }p[1005]; 17 18 double map[1005][1005]; 19 double vis[1005]; 20 double dis[1005]; 21 22 double dist1(Circle a,Circle b){ 23 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))-a.r-b.r; 24 } 25 26 double dist2(double a,double b,double c,Circle d){ 27 return (fabs(a*d.x+b*d.y+c)/sqrt(a*a+b*b)-d.r); 28 } 29 30 void Dijstra(){ 31 for(int i=1;i<=n+2;i++){ 32 dis[i]=map[1][i]; 33 vis[i]=0; 34 } 35 vis[1]=1; 36 dis[1]=0; 37 for(int i=1;i<n+2;i++){ 38 double minn=INF; 39 int pos=0; 40 for(int j=1;j<=n+2;j++){ 41 if(!vis[j]&&dis[j]<minn){ 42 minn=dis[j]; 43 pos=j; 44 } 45 } 46 vis[pos]=1; 47 for(int j=1;j<=n+2;j++){ 48 if(!vis[j]&&dis[j]>minn+map[pos][j]){ 49 dis[j]=minn+map[pos][j]; 50 } 51 } 52 } 53 cout<<dis[n+2]<<endl; 54 } 55 56 int main(){ 57 std::ios::sync_with_stdio(false); 58 cin>>n>>A>>B>>C1>>C2; 59 for(int i=0;i<1005;i++){ 60 for(int j=0;j<1005;j++){ 61 map[i][j]=INF; 62 } 63 } 64 for(int i=2;i<=n+1;i++){ 65 cin>>p[i].x>>p[i].y>>p[i].r; 66 } 67 double tmp; 68 for(int i=2;i<=n+1;i++){ 69 for(int j=i+1;j<=n+1;j++){ 70 tmp=dist1(p[i],p[j]); 71 if(tmp>0) 72 map[i][j]=map[j][i]=tmp; 73 else 74 map[i][j]=map[j][i]=0; 75 } 76 } 77 for(int i=2;i<=n+1;i++){ 78 tmp=dist2(A,B,C1,p[i]); 79 if(tmp>0) 80 map[1][i]=map[i][1]=tmp; 81 else 82 map[1][i]=map[i][1]=0; 83 tmp=dist2(A,B,C2,p[i]); 84 if(tmp>0) 85 map[n+2][i]=map[i][n+2]=tmp; 86 else 87 map[n+2][i]=map[i][n+2]=0; 88 } 89 map[1][n+2]=map[n+2][1]=fabs(C1-C2)/sqrt(A*A+B*B); 90 Dijstra(); 91 92 }
标签:bsp www. .com blank 输出 i++ std void test
原文地址:https://www.cnblogs.com/Fighting-sh/p/9735995.html