列表

详情


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;
}


上一题