NC16746. 神奇盘子
描述
输入描述
第一行一个整数r(1 <= r <= 1000)代表盘子的半径。
接下来两行两个整点分别代表大象所在的位置和大象目标的位置坐标。保证两个点都在圆内(可能在边界上),圆心在点(0, 0)上。
输出描述
输出一个实数,代表大象最短需要移动多少距离。和标程相对或绝对相差1e-6都算正确。
示例1
输入:
1 0 1 0 -1
输出:
0.000000000000
示例2
输入:
4 3 0 -3 0
输出:
2.000000000000
说明:
示例3
输入:
100 -59 76 3 69
输出:
62.393909959226
C++(g++ 7.5.0) 解法, 执行用时: 373ms, 内存消耗: 504K, 提交时间: 2023-01-04 16:12:50
#include<bits/stdc++.h> using namespace std; const double PI = acos(-1.0); double f(double x1,double y1,double x2,double y2) { return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); } int main() { double r; double x1,x2,y1,y2; cin>>r; cin>>x1>>y1>>x2>>y2; double ans = f(x1,y1,x2,y2); for(double i=0;i<2*PI;i+=0.000001) { double x3 = r * cos(i); double y3 = r * sin(i); ans = min(ans,f(x1,y1,x3,y3) + f(-x2,-y2,x3,y3)); } printf("%.12lf\n",ans); return 0; }
C++ 解法, 执行用时: 24ms, 内存消耗: 452K, 提交时间: 2022-01-05 16:24:43
#include<bits/stdc++.h> using namespace std; #define PI acos(-1.0) double r,a,b,c,d; int main() { double i,ans; scanf("%lf%lf%lf%lf%lf",&r,&a,&b,&c,&d); ans=sqrt((a-c)*(a-c)+(b-d)*(b-d)); for(i=0;i<=360;i+=1e-3) { double xx,yy,res; xx=r*cos(i*PI/180); yy=r*sin(i*PI/180); res=sqrt((c-xx)*(c-xx)+(d-yy)*(d-yy))+sqrt((a+xx)*(a+xx)+(b+yy)*(b+yy)); if(ans>res) ans=res; } printf("%.12f",ans); return 0; }