Codeforces Round #287 (Div. 2) B. Amr and Pins(数学/思维)
https://codeforces.com/contest/507/problem/B
题目大意:
Amr有一个半径为r、圆心在点(x,y)的圆。他希望圆心在新的位置(x ',y ')。
在一个步骤中,Amr可以将一个大头针放在圆的边界的某个点上,然后将圆围绕该大头针旋转任意角度,最后移除该大头针。
帮助Amr以最少的步骤实现他的目标。
投入
输入由5个空格分隔的整数r,x,y,x' y' (1 ≤ r ≤ 105,- 105 ≤ x,y,x ',y' ≤ 105)、圆半径、圆心原点坐标和圆心终点坐标组成。
输出
输出单个整数-将圆心移动到目标点所需的最少步数。注意
在第一个示例测试中,最佳方式是在点(0,2)上放一个大头针,然后逆时针(或顺时针,无所谓)旋转圆180度。
input
2 0 0 0 4
output
1
inputCopy
1 1 1 4 4
output
3
input
4 5 6 5 6
output
0
如图所示:
我们可以从题目条件了解到,我们可以按着这个圆的任意边让他旋转任意角度,所以当前的圆心下一个可以跑到的位置就是以圆心为中心的半径为2d的圆内
我们奔着目标点的方向一直这样最大化旋转,就可以到达一个最挨近它的地方
当刚好到达目标值,就可以整除2d
不然的话就需要多一个旋转
ceil向上取整
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=200200,M=2002;
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int T=1;
//cin>>T;
while(T--)
{
LL d,x,y,n,m;
cin>>d>>x>>y>>n>>m;
double dist=sqrt(abs(x-n)*abs(x-n)+abs(y-m)*abs(y-m));
//cout<<dist<<endl;
//cout<<(int)dist/(2*d)<<endl;
printf("%.0lf",ceil(dist/(2*d)));
}
return 0;
}