CodeForces - 908C New Year and Curling
2018-01-02 19:48
211 查看
C. New Year and Curling
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard 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
input
output
Note
The final positions of the disks will look as follows:
In particular, note the position of the last disk.
思路:一开始的思路是用一个set容器存圆心坐标,按照y从大到小排序。每次输入一个x,从头遍历set,直到找到一个点的x与当前x的差值<=2*r,计算这个y值,存进set。若没有找到,则y=r。但这个思路是错的。因为寻找圆心的时候不能只考虑y的大小,还需要考虑圆心与当前圆心的夹角,显然需要取夹角较小的,这样得到的圆心才越高。
这样一来我们就需要比较所有的圆,得到的y值取最大。
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int n,r;
double x[1005],y[1005];
int main()
{
while(~scanf("%d%d",&n,&r))
{
for(int i=0;i<n;i++)
{
scanf("%lf",&x[i]);
y[i]=r;
for(int j=0;j<i;j++)
{
if(fabs(x[j]-x[i])<=2*r)
{
y[i]=max(y[i],y[j]+sqrt(4*r*r-(x[j]-x[i])*(x[j]-x[i])));
}
}
printf("%.10f ",y[i]);
}
printf("\n");
}
return 0;
}
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard 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
input
6 2 5 5 6 8 3 12
output
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.
思路:一开始的思路是用一个set容器存圆心坐标,按照y从大到小排序。每次输入一个x,从头遍历set,直到找到一个点的x与当前x的差值<=2*r,计算这个y值,存进set。若没有找到,则y=r。但这个思路是错的。因为寻找圆心的时候不能只考虑y的大小,还需要考虑圆心与当前圆心的夹角,显然需要取夹角较小的,这样得到的圆心才越高。
这样一来我们就需要比较所有的圆,得到的y值取最大。
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int n,r;
double x[1005],y[1005];
int main()
{
while(~scanf("%d%d",&n,&r))
{
for(int i=0;i<n;i++)
{
scanf("%lf",&x[i]);
y[i]=r;
for(int j=0;j<i;j++)
{
if(fabs(x[j]-x[i])<=2*r)
{
y[i]=max(y[i],y[j]+sqrt(4*r*r-(x[j]-x[i])*(x[j]-x[i])));
}
}
printf("%.10f ",y[i]);
}
printf("\n");
}
return 0;
}
相关文章推荐
- Codeforces 822C Hacker, pack your bags!(思维+技巧)
- CodeForces - 883E Field of Wonders
- CodeForces 547A--找循环节
- codeforces contest 358
- CodeForces 137A
- Codeforces 549F Yura and Developers
- codeforces 200 c Football Championship(枚举)
- codeforces 889B. Restoration of string(拓扑排序)
- Codeforces 161D Distance in Tree
- CodeForces - 357C C - Knight Tournament 并查集or set模拟
- codeforces 330A 330B 329A 分别是7月20DIV2的前三题
- Codeforces 551C GukiZ hates Boxes(二分)
- Codeforces 822C - Hacker, pack your bags!(二分)
- codeforces 891B - Gluttony
- CodeForces 688A-Opponents
- CodeForces 735D - Taxes
- CodeForces 154B——Colliders——筛选素数,模拟标记
- Codeforces 552E - Vanya and Brackets【表达式求值】
- CodeForces:Cards
- codeforces 888D Almost Identity Permutations (组合数+错排)