Wednesday, 8 April 2015

                                  Amr and Pins


Amr loves Geometry. One day he came up with a very interesting problem.
Amr has a circle of radius r and center in point (x, y). He wants the circle center to be in new position (x', y').
In one step Amr can put a pin to the border of the circle in a certain point, then rotate the circle around that pin by any angle and finally remove the pin.
Help Amr to achieve his goal in minimum number of steps.
Input
Input consists of 5 space-separated integers rxyx' y' (1 ≤ r ≤ 105 - 105 ≤ x, y, x', y' ≤ 105), circle radius, coordinates of original center of the circle and coordinates of destination center of the circle respectively.
Output
Output a single integer — minimum number of steps required to move the center of the circle to the destination point.
Sample test(s)
input
2 0 0 0 4
output
1
input
1 1 1 4 4
output
3
input
4 5 6 5 6
output
0
Note
In the first sample test the optimal way is to put a pin at point (0, 2) and rotate the circle by 180 degrees counter-clockwise (or clockwise, no matter).


####################################editorial#######################################
Hint: What is the shortest path between two points? A direct line. So moving the center on that line with maximum move possible each time will guarantee minimal number of moves.
Solution: Let's draw a straight line between the two centers.
Clearly to move the center with maximum distance we need to rotate it around the intersection of the line and the circle with 180degrees. So the maximum distance we can move the center each time is 2 * R. Let's continue moving the center with 2 * R distance each time until the two circles intersects. Now obviously we can make the center moves into its final position by rotating it around one of the intersection points of the two circles until it reaches the final destination.
Every time we make the circle moves 2 * R times except the last move it'll be  ≤ 2 * R. Assume that the initial distance between the two points is d So the solution to the problem will be .
Time complexity: 
######################################code#######################################
#include<iostream>
#include<math.h>
using namespace std;
 int main()
 {
   double a,b,c,d,e;
     cin>>a>>b>>c>>d>>e;
        cout<<ceil((double(sqrt((b-d)*(b-d)+(c-e)*(c-e)))/(2*a)));
        return 0;
 }

1 comment: