zoj 3733 skycity

题意:给你最顶层圆的半径r和最底层远的半径R,每层楼的高度H,楼的层数f,玻璃的最小面积s,要你求出能围住每个圆的最小玻璃面积。

一开始没看懂题意,就试着将圆的半径按等差数列递减,没想到居然对了。

推理可以得出,围住圆的多边形边数越多,所需的玻璃的面积就越少,所以只要求出围住每层圆的最多正多边形的边数就可以求出最后所需的最少的玻璃面积。而求出正多变形的方法,我用的和第一道题一样的方法,二分查找,从3条边到100000进行查找,最后就可以得出,而且玻璃的面积要大于s。

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<map>
#include<bitset>
#include<vector>
#include<cmath>
using namespace std;
const double pi=acos(-1.0);
int r,R,h,f,s;
double caldis(int n,double r)
{
    return 2.0*r*tan(pi/n);
}
int main()
{
    int i,j,k;
    while(scanf("%d%d%d%d%d",&R,&r,&h,&f,&s)!=EOF)
    {
        double sh=(double)h/f;
        double ans=0;
        int larn=100000;
        for(i=f;i>=1;i--)
        {
            double rr=1.0*(R-r)/f*(i-1)+r;
            int minn=3,maxx=larn;
            int mid,num;
            double ss;
            while(minn<=maxx)//二分求出多边形的最多边数
            {
                mid=(minn+maxx)>>1;
                double tmp=caldis(mid,rr)*sh;
                if(tmp-s>0)//最小面积要大于s
                {
                    ss=tmp;
                    num=mid;
                    minn=mid+1;
                }
                else
                maxx=mid-1;
            }
            ans+=num*ss;
            larn=num;
        }
        printf("%.3lf\n",ans);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值