【三分】HDU3756 Dome of Circus

  • 假設我們枚舉一個半徑r ,那麼分別考慮包含進每個點圓錐的最小高度h0,h1,,hn1 ,顯然此時如果半徑爲r ,圓錐高度應爲maxn1i=0 hi ,簡單推算一下公式,可以發現體積關於半徑是個凹函數,於是三分半徑即可。
  • 注意初始的半徑範圍,上限自然可以隨便設置一個較大值,但下限需要稍加考慮。設
    di=xi2+yi2
    那麼r 應滿足
    r>max{di},0i<n
  • 輸入輸出部分,即使ios::sync_with_stdio(false)也無法避免cincout的超時問題,所以似乎必須用printfscanfIO
/* **********************************************

    File Name: 3756.cpp

    Auther: [email protected]

    Created Time: 2015/9/9 星期三 下午 7:07:06

*********************************************** */
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> P;
const double EPS = 1e-4;
const double INF = (double)INT_MAX;
const int MAX = 10007;
struct Pos {
    double x, y, z;
} a[MAX];
int n;

istream& operator>>(istream& in, Pos& p) {
    in >> p.x >> p.y >> p.z;
    return in;
}

pair<double, double> gao(double r) {
    double h = 0.0;
    for (int i = 0; i < n; ++i) {
        double dis = a[i].x * a[i].x + a[i].y * a[i].y;
        dis = sqrt(dis);
        //printf("dis = %f\n", dis);
        //getchar();
        double tp = a[i].z / (r - dis) * dis + a[i].z;
        if (tp > h) h = tp;
    }
    return make_pair(h, r * r * h);
}

pair<double, double> cut(double le, double ri) {
    double md, mdmd;
    while (ri - le > EPS) {
        //printf("le = %f, ri = %f\n", le, ri);
        md = (le + ri) * 0.5;
        mdmd = (md + ri) * 0.5;
        if (gao(mdmd).second > gao(md).second) {
            ri = mdmd;
        } else {
            le = md;
        }
    }
    //printf("le = %f, ri = %f\n", le, ri);
    return make_pair(gao(le).first, le);
}

int main() {
    int T;
    scanf(" %d", &T);
    while (T--) {
        scanf(" %d", &n);
        double mindis = 0.0;
        for (int i = 0; i < n; ++i) {
            scanf(" %lf %lf %lf", &a[i].x, &a[i].y, &a[i].z);
            mindis = min(mindis, sqrt(a[i].x * a[i].x + a[i].y * a[i].y));
        }
        //auto res = make_pair(0.0, 0.0);
        auto res = cut(mindis + EPS, 100000.0);
        printf("%.3f %.3f\n", res.first + EPS, res.second + EPS);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章