C. New Year and Curling
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
Carol is currently curling.
She has n disks each with radius r on the 2D plane.
Initially she has all these disks above the line y = 10100.
She then will slide the disks towards the line y = 0 one by one in order from 1 to n.
When she slides the i-th disk, she will place its center at the point (xi, 10100). She will then push it so the disk’s y coordinate continuously decreases, and x coordinate stays constant. The disk stops once it touches the line y = 0 or it touches any previous disk. Note that once a disk stops moving, it will not move again, even if hit by another disk.
Compute the y-coordinates of centers of all the disks after all disks have been pushed.
Input
The first line will contain two integers n and r (1 ≤ n, r ≤ 1 000), the number of disks, and the radius of the disks, respectively.
The next line will contain n integers x1, x2, …, xn (1 ≤ xi ≤ 1 000) — the x-coordinates of the disks.
Output
Print a single line with n numbers. The i-th number denotes the y-coordinate of the center of the i-th disk. The output will be accepted if it has absolute or relative error at most 10 - 6.
Namely, let’s assume that your answer for a particular value of a coordinate is a and the answer of the jury is b. The checker program will consider your answer correct if for all coordinates.
Example
inputCopy
6 2
5 5 6 8 3 12
outputCopy
2 6.0 9.87298334621 13.3370849613 12.5187346573 13.3370849613
Note
The final positions of the disks will look as follows:
In particular, note the position of the last disk.
题意:给你n个圆,告诉你半径和x坐标,要你求最大y坐标,为什么是最大,因为题意说了y是从上到下移动的(开始因为没有找最大,差点自闭,_)
思路:首先第一个圆的坐标是已知的,y就等于r,然后第二个圆x是已知的,要 求y,所以只需要一个方程就可以求解,所以我们利用两点间的距离公式
最后化简得到
所以最后直接暴力就行了
代码:
#include<bits/stdc++.h>
#define LL long long
#define Max 100005
const LL mod=1e9+7;
const LL LL_MAX=9223372036854775807;
using namespace std;
struct node
{
double x2,y1;
} a[1005];
int main()
{
int n;
double r;
scanf("%d%lf",&n,&r);
double R=(r+r)*(r+r);
int len=0;
double y1,x1;
for(int i=0; i<n; i++)
{
scanf("%lf",&x1);
if(i==0)
{
printf("%.10f ",r);
a[len].x2=x1;
a[len].y1=r;
len++;
}
else
{
int i;
double ans=0;
for(i=len-1; i>=0; i--)
{
if(fabs((x1-a[i].x2))<=r+r)
{
y1=a[i].y1;
y1=sqrt(R-(x1-a[i].x2)*(x1-a[i].x2))+y1;
ans=max(ans,y1);
}
}
if(ans!=0)
{
printf("%.10f ",ans);
a[len].x2=x1;
a[len].y1=ans;
len++;
}
else
{
printf("%.10f ",r);
a[len].x2=x1;
a[len].y1=r;
len++;
}
}
}
return 0;
}