POJ3737 POJ3301【三分】

POJ 3737 - UmBasketella

题面 :给定一个圆锥的表面积(包括下底),求最大的体积和该条件下的半径和高

题解 :三分半径,当半径等于0的时候为下限,当母线等于r的时候为上限。易得出半径的范围(0,sqrt(s/(2*pi)))。由 S = pi * r * (r + l) 易得出 l = (s - pi * r^2) / (pi * r) , h = sqrt(l^2- r^2) ,所以 v =(pi * r^2 * h) / 3。

#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;    
const double pi = acos((double)(-1));
#define inf 0x3f3f3f3f
#define ll long long
const int maxn = 20010;
const int mod = 1e9 + 7;
double s, v, r , h,l;
double f(double radius){
    l = (s - pi*radius*radius)/(pi*radius);
    h = sqrt(l*l - radius*radius);
    v = (h*pi*radius*radius)/3.0;
    r = radius;
    return v;
}
double sanfen(){
    double right , left ,midl, midr;
    left = 0;
    right = sqrt(s/(2*pi));
    while(right - left > 1e-6){
        midl = left + (right - left)/3;
        midr = right - (right - left)/3;
        if(f(midl) > f(midr)) right = midr;
        else left = midl;
    }
    return f(left);
}
int main(){
    while(~scanf("%lf",&s)){
        printf("%.2f\n",sanfen());
        printf("%.2f\n%.2f\n",h,r);
    }
    return 0;
}

POJ 3301 - Texas Trip

题意 :给出二维坐标上的n个点,要求找到一个正方形使它覆盖所有点并且面积最小。

题解 :旋转坐标系,三分旋转角度(看了大佬的博客才知道的)。从0旋转到180度 ,寻找横向的最长距离和纵向的最长距离,取这两个的最大值作为正方形的边长。旋转后的坐标有对应的公式:
X’ = x * cos(angle) - y * sin(angle)
Y’ = y * cos(angle) + x * sin(angle)

#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;    
const double pi = acos((double)(-1));
#define inf 0x3f3f3f3f
#define ll long long
#define eps 1e-9
const int maxn = 20010;
const int mod = 1e9 + 7;
int t, n;
double l,r,midl,midr;
struct Point{
    double x,y;
}p[35];
double f(double angle){
    double maxx = -inf , minx = inf , maxy = -inf, miny = inf;
    for(int i = 1;i <= n ;i++){
        double _x = p[i].x*cos(angle) - p[i].y*sin(angle);
        double _y = p[i].y*cos(angle) + p[i].x*sin(angle);
        maxx = max(maxx, _x);
        minx = min(minx, _x);
        maxy = max(maxy, _y);
        miny = min(miny, _y);
    }
    double a = max(maxx - minx, maxy - miny);
    return a*a;
}
double sanfen(){
    l = 0,r = 180;
    while(r - l > eps){
        midl = l + (r - l)/3;
        midr = r - (r - l)/3;
        if(f(midl) > f(midr)) l = midl;
        else r = midr;
    }
    return f(r);
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i = 1;i <= n;i++) {
            scanf("%lf%lf",&p[i].x,&p[i].y);
        }
        printf("%.2f\n",sanfen());
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值