小A与圆(Pins.cpp)—CF507B—1400
时间限制 1s | 空间限制 256M
题目描述:
小A喜欢几何学。有一天他想出一个非常有趣的问题。
小A有一个半径为r,中心在点(x, y)的圆。他希望将圆心移动到新的位置(x’, y’)。
在一步操作中,小A可以将一个图钉插在圆的边界的某一点上,然后将圆绕该图钉旋转任意角度,最后移除图钉。
帮助小A以最少的步骤实现他的目标。
输入格式:
输入由5个以空格分隔的整数组成,分别是半径r、圆的原始中心坐标x和y,以及圆的目标中心坐标x’和y’
(其中1<=r<=10^5,-10^5<=x,y,x',y'<=10^5)。
输出格式:
输出一个整数,表示将圆的中心移动到目标点所需的最小步数。
样例输入输出:
样例1输入 | 样例1输出 |
---|---|
2 0 0 0 4 | 1 |
样例2输入 | 样例2输出 |
---|---|
1 1 1 4 4 | 3 |
样例2输入 | 样例2输出 |
---|---|
4 5 6 5 6 | 0 |
样例解释:
在第一个示例测试中,最佳方法是在点(0, 2)处插入一个针,并将圆逆时针或顺时针旋转180度。
题解:
为了步伐更大,每次将定点定在圆周上。
那么,结果显而易见,答案就是(x, y)和的(x’, y’)距离除以r×2的积并向上取整。
答案就为ans=⌈\sqrt {(y′−y)^2+(x′−x)^2}/(r×2)⌉
参考代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long l,r,x1,x2,y1,y2,ans;
scanf("%lld%lld%lld%lld%lld",&r,&x1,&y1,&x2,&y2);
ans=ceil(double(sqrt((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1))/(2*r)));
printf("%lld",ans);
return 0;
}