codefroces 908C New Year and Curling

很简单的一道题,结果被自己两次写傻逼,错失一次涨分的机会啊。

心痛。。

就是给你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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值