CF908 C. New Year and Curling

本文详细解析了C.NewYearandCurling题目,介绍了如何通过已知的圆半径和x坐标来计算圆的最大y坐标。通过数学公式推导,提供了完整的算法思路和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值