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的圆内
我们奔着目标点的方向一直这样最大化旋转,就可以到达一个最挨近它的地方
当刚好到达目标值,就可以整除2
d
不然的话就需要多一个旋转

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;
}
posted @ 2022-08-29 17:44  高尔赛凡尔娟  阅读(19)  评论(0编辑  收藏  举报