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