hdu 3756 三分 Dome of Circus

本文探讨如何通过三分法解决给定点集覆盖问题,求解最小体积圆锥体的半径和高度。通过实例演示算法实现及优化策略,旨在提供一种高效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

       给你很多个点,让你输出一个r和h,使这样的圆锥体能覆盖给出的所有点并且体积最小。

题解:

       三分(因为是个最值的问题)。枚举r,得到h。

做题过程:

     wa了一两次。刚开始是因为只输出2位小数,而题目的要求是输出3位小数。后来就再也找不到错误了。 最后,在今天,将三分的上限改了一改,就A了。。。只能说,我还too young ,too simple啊。。。

/*
Pro: 0

Sol:

date:
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#define eps 1e-7
#include <set>
#include <vector>
using namespace std;
struct point{
    double x,y,z;
    point(){}
    point(double a, double b, double c){x = a, y = b, z = c;}
}p[11111];
int n,T;
double a,b,c;
double cal(double r){
    double h ,Max = 0;
    for(int i = 0; i < n; i ++){
        h = p[i].z * r / (r - sqrt(p[i].x * p[i].x + p[i].y * p[i].y));
        Max = max(h,Max);
    }
    return r * r * Max;
}
void thi(double &r, double &h){
    double low = 0.0, high = 10000;
    double m1,m2;
    while(low + eps < high){
        m1 = (low + high) / 2.0;
        m2 = (m1 + high) / 2.0;
        if(cal(m1) <= cal(m2)) high = m2;
        else {
            low = m1;
        }
    }
    r = low;
    h = -1;
    for(int i = 0; i < n; i ++){
        h = max(h,p[i].z * r / (r - sqrt(p[i].x * p[i].x + p[i].y * p[i].y)) );
    }
}
int main(){
    scanf("%d",&T);
    while(T --){
        scanf("%d",&n);
        for(int i = 0; i < n; i ++){
            scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
        }
        double r,h;
        thi(r,h);
        printf("%.3f %.3f\n",h,r);
    }
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值