zoj 3733 Skycity

           几何。给题意跪了。。。circular truncated cone 这句话是重点,只有读懂这句话才能做出来这道题。。。千万别看图,看了图就哭了。。。在这里给大家说一下题意吧,相信知道题意的话是很容易过的。

           题意:给你一个圆台,即把圆锥的顶去掉,然后给你上表面半径,下表面半径,然后告诉你需要装多少层玻璃,每层高度相同,每层装玻璃的时候保证装出来的是正棱柱,然后还有一个要求就是每个棱柱面的面积不小于s。由于是圆柱,而且知道了一共多少层,那么每层半径就可以直接求出来,还有一个要注意的地方就是正棱柱要完全包含每一层的上底(不知道这样的玻璃是怎么装上的。),每一层直接算正棱柱的最大边数就可以了,因为边数越大,越“贴近”圆,则最终面积肯定最小,根据s可以确定上界,然后就可以直接知道边数了。要求的是使用玻璃面积的最小值。

                             

           求圆的外切正多边形,边长大于等于s*2.对于这个问题,我们先求出图示夹角d,然后由于tan(d) = s / ri;所以,d 越大,s越大,边数越少。所以要使得正多边形的边长大于等于s*2,只需要对(2 * PI)   /   (2 * d)   向下取整作为正多边形的边数,必然使得边长大于s(而且此时边数肯定最多)。

#include<cstdio>
#include<cmath>

using namespace std;
const double PI = acos(-1.0);
double R, r, h, f, s;///R:圆台下表面半径。  r:圆台上表面半径。   h:圆台高度。    f:最终玻璃的层数。   s:每块玻璃的最小面积。
int main()
{
    double ans, d, ri, ad;
    while(scanf("%lf%lf%lf%lf%lf", &R, &r, &h, &f, &s) != EOF)
    {
        ans = 0;ad = (R - r) / f;ri = r;
        s = s / 2 / (h / f);///h / f是每层圆台的高度,即玻璃的高度。最小面积s除以每层高度,再除以2,即为图示s。
        for(int i = 0; i < f; i ++)
        {
            d = atan(s / ri);///如图中d。
            int tmp = PI / d;///向下取整。
            ans += tmp * ri * tan(PI / tmp) * 2.0;
            ri += ad;
        }
        printf("%.3lf\n", ans * h / f);
    }
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值