很简单的一道题,结果被自己两次写傻逼,错失一次涨分的机会啊。
心痛。。
就是给你N个圆,和他们X坐标的信息,然后依次下落,如果碰到某一个圆,就会停止,最后问你每个圆的Y坐标。因为数据非常小,直接枚举就行。
我很傻逼的认为,每个圆会与2*R返回内,y最大的那个圆碰撞,结果第一次写,没有考虑,不存在这个圆时,结果被hack,然后这个结论其实也是错误的。因为,他第一次碰到的不一定就是最高的那个圆,比如下图
左边的圆y坐标更小,但是先碰撞的就是坐标的圆,这里应该有个夹角的考虑。因为数据小直接用max,枚举就行。
啊啊啊啊,心痛啊。本来能出新手村的。
又错失一波大涨分啊。。。
好菜啊。。。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long double ld;
const int MAX = 1010;
ld eps = 1e-13;
int N,R;
int x[MAX];
ld ans[MAX];
void solve(){
ans[1] = (ld)R;
for(int i=2;i<=N;++i){
ans[i] = (ld)R;
ld ez = 2*R;
for(int j=1;j<i;++j){
if(abs(x[i] - x[j]) <= 2*R){
ld ex = (ld)abs(x[i]-x[j]);
ans[i] = max(ans[i],sqrt(ez*ez-ex*ex)+ans[j]);
}
}
}
cout << fixed << setprecision(13) << ans[1];
for(int i=2;i<=N;++i){
cout << fixed << setprecision(13) << " " << ans[i];
}
}
int main(void){
cin >> N >> R;
for(int i=1;i<=N;++i){
cin >> x[i];
}
solve();
return 0;
}