• hdu 3756 Dome of Circus(三分)


    题意:求能将所有点覆盖的最小体积的圆锥。

    体积变化为凹形,故可以三分半径r,再枚举各个点找最大的高h。

    View Code
     1 /*
     2 Author:Zhaofa Fang
     3 Lang:C++
     4 */
     5 #include <cstdio>
     6 #include <cstdlib>
     7 #include <sstream>
     8 #include <iostream>
     9 #include <cmath>
    10 #include <cstring>
    11 #include <algorithm>
    12 #include <string>
    13 #include <utility>
    14 #include <vector>
    15 #include <queue>
    16 #include <stack>
    17 #include <map>
    18 #include <set>
    19 using namespace std;
    20 
    21 typedef long long ll;
    22 #define DEBUG(x) cout<< #x << ':' << x << endl
    23 #define REP(i,n) for(int i=0;i < (n);i++)
    24 #define REPD(i,n) for(int i=(n-1);i >= 0;i--)
    25 #define FOR(i,s,t) for(int i = (s);i <= (t);i++)
    26 #define FORD(i,s,t) for(int i = (s);i >= (t);i--)
    27 #define PII pair<int,int>
    28 #define PB push_back
    29 #define MP make_pair
    30 #define ft first
    31 #define sd second
    32 #define lowbit(x) (x&(-x))
    33 #define INF (1<<30)
    34 
    35 
    36 const double PI = 3.1415926;
    37 int n;
    38 struct point
    39 {
    40     double x,y,z;
    41 }P[10005];
    42 double volume(double r,double h)
    43 {
    44     return PI*r*r*h/3.0;
    45 }
    46 
    47 double fun(double r,double &hx)
    48 {
    49     double MAX = 0;
    50     REP(i,n)
    51     {
    52         double h = P[i].z*r/(r-sqrt(P[i].x*P[i].x+P[i].y*P[i].y));
    53         MAX = max(MAX,h);
    54     }
    55     hx = MAX;
    56     return volume(r,MAX);
    57 }
    58 int main()
    59 {
    60     //freopen("in","r",stdin);
    61     //freopen("out","w",stdout);
    62     int T;
    63     scanf("%d",&T);
    64     while(T--)
    65     {
    66         scanf("%d",&n);
    67         double M=0;
    68         REP(i,n)
    69         {
    70             scanf("%lf%lf%lf",&P[i].x,&P[i].y,&P[i].z);
    71             M = max(M,sqrt(P[i].x*P[i].x+P[i].y*P[i].y));
    72         }
    73         double l=M+1e-6,r=100000.0,hx;
    74         while(fabs(l-r) > 1e-6)
    75         {
    76             double lm = l + (r-l)/3.0;
    77             double rm = r - (r-l)/3.0;
    78             if(fun(lm,hx)<fun(rm,hx))r = rm;
    79             else l = lm;
    80         }
    81         printf("%.3f %.3f\n",hx,r);
    82     }
    83     return 0;
    84 }
    by Farmer
  • 相关阅读:
    交叉编译fw_printenv
    解压 xxxx.cpio.gz.u-boot
    创建Uboot 环境变量 bin 文件
    Linux快速显示图片
    移动终端的GPU显卡介绍
    Video Mode Timings
    change systemd service
    device tree DTB DTC 相互转换
    如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)
    解决h5在ios 微信中 input框键盘收起 页面底部留白
  • 原文地址:https://www.cnblogs.com/fzf123/p/2934951.html
Copyright © 2020-2023  润新知