記事タイトルCoderforces 908 C New Year and Curling(暴力)

4111 ワード

トランスファゲートhttp://codeforces.com/problemset/problem/908/C 标题:2次元座標系にはn個の半径rの円があり、最初は無限遠に出たxi位置で、それから順番に1個の円がy=0の方向に移動し、他の円にぶつかったりy=0にぶつかったりして停止し、最後に各円が最後に停止したときのy座標の位置を求めます.円が停止すると、他の円にぶつかっても移動しません.分析:まずデータは1000しかないので、直接暴力O(n 2)で解き、i番目の円について、1~i-1番目の円を巡り、i番目の円とぶつかるかどうかを判断し、ぶつかると、株の定理でy座標を求め、その後、遍歴して最大のy座標を求めたのが前円の座標位置コードである.
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

typedef pair<int ,int> pii;
typedef long long ll;

const int maxn = 1e5 + 10;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;

int n,r;
int x[maxn];
double y[maxn];//y   

int main()
{
    while (cin>>n>>r){
        for (int i=1;i<=n;i++){
            cin>>x[i];
        } 
        y[1]=r;
        for (int i=2;i<=n;i++){
            y[i]=1.0*r;
            for (int j=1;jif (fabs(x[j]-x[i])>2*r)continue;//       
                else {
                    int g = (2*r)*(2*r)-fabs(x[j]-x[i])*fabs(x[j]-x[i]);
                    double tmp = sqrt(g);
                    tmp += y[j];
                    y[i]=max(tmp,y[i]);
                }

            }
        }
        for (int i=1;i<=n;i++){
            if (i==1)printf ("%.8f",y[i]);
            else printf (" %.8f",y[i]);
        }
        printf ("
"
); } return 0; }