CF908 C. New Year and Curling

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值