Codeforces Good Bye 2017 C. New Year and Curling(運用數學解析幾何的知識判斷)

haixinjiazu發表於2019-05-11

題目:C. New Year and Curling
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
Input
6 2
5 5 6 8 3 12
Output
2 6.0 9.87298334621 13.3370849613 12.5187346573 13.3370849613
(原題http://codeforces.com/contest…);

題意:第一行輸入兩個數,第一個表示圓的個數,這些圓都是相同的,第二個數表示圓的半徑大小,第二行輸入每個圓的圓心的橫座標,且第一個圓先放,後面依次放,即從圓心的橫座標這個放下去,到X軸停下或者碰到另一個圓停下,讓輸出最後每個圓的圓心的縱座標;

思路:關鍵在於判斷這次放下的圓是否會碰到之前所有放下的圓,所有就是根據半徑與橫座標之差來進行判斷;(注意點,用直徑的平方減去橫座標的平方來判斷其兩圓心的距離是否達到了要相碰的條件)(之後再計算縱座標的時候,有可能因為縱座標之差導致不會再相碰了,這個也要再判斷一下);

新技巧:這題因為涉及了直角座標系,所以要用解析結合的一些知識(公式或者性質等)來整理思路判斷,進而寫出程式碼;

程式碼:

#include<stdio.h>
#include<math.h>

int main()
{
    double x[1005],y[1005],tag;
    int n,r,i,j;
    scanf("%d%d",&n,&r);
    for(i=0;i<n;i++)
        scanf("%lf",&x[i]);
    for(i=0;i<n;i++)
        y[i]=r;
    for(i=0;i<n;i++)
    {
        for(j=0;j<i;j++)
            if(0<=4.0*r*r-(x[i]-x[j])*(x[i]-x[j]))
            {
                tag=y[j]+sqrt(4.0*r*r-(x[i]-x[j])*(x[i]-x[j]));
                if(tag>y[i])
                    y[i]=tag;
            }
    }
    for(i=0;i<n;i++)
    {
        printf("%lf",y[i]);
        if(i!=n-1)
            printf(" ");
    }
    printf("
");
    return 0;
}

相關文章