UVALive 6748 2D-Solar System

来源:互联网 发布:mac系统ai2018破解码 编辑:程序博客网 时间:2024/05/29 02:44

按照初始位置排序,那么答案必定小于等于相邻两个圆相切的情况。
注意到对于一个圆,令左端离他最近的半径比他大的圆的位置为L,右端离他最近的半径比他大的圆的位置为R,这个圆只会受到L到R这段区间的影响。
所以维护一个半径单调递减的栈即可。

代码:

#include<bits/stdc++.h>using namespace std;const int N = 5e4+5;struct node {    int r, a, b;    bool operator < (const node& A) const {        return b < A.b;    }}c[N];double solve(node B, node A) {    if(B.a > A.a) return (sqrt(A.r)*sqrt(B.r)*2+B.b-A.b)/(A.a-B.a);    return 1e20;}int main() {    int n;    while(~scanf("%d", &n)) {        if(n == 0) break;        for(int i = 0; i < n; i++) scanf("%d%d%d", &c[i].r, &c[i].a, &c[i].b);        sort(c, c+n);        stack<node> S; S.push(c[0]);        double ans = 1e20;        for(int i = 1; i < n; i++) {            while(!S.empty()) {                node x = S.top();                ans = min(ans, solve(x, c[i]));                if(x.r < c[i].r) S.pop();                else break;            }            S.push(c[i]);        }        if(ans == 1e20) puts("Collision-Free System");        else printf("%.2f\n", ans);    }    return 0;}
原创粉丝点击