zoukankan      html  css  js  c++  java
  • 2013 ACM区域赛长沙 H zoj 3733 (hdu 4798) Skycity

    题意:一个圆台,底面和顶面半径分别为R,r,然后高度为H,一共F层,每层高度一样,然后要在每层的天花板上贴方格玻璃,方格玻璃要满足以下几个条件:

    方格玻璃面积不能小于S,且方格玻璃要围成一个正多边形,且正好将天花板围住(也就是说天花板的圆面是这个多边形的内接圆),并且要使得贴的玻璃数量尽量少,也就是说这个正多边形的边数要尽量少。问最后所用玻璃的总面积。

    思路:先求每个圆的半径,也就是等差数列。再二分正多边行数量。二分容易出错,此题还有精度要求。。。。。

     1 #include <iostream>
     2 #include <string.h>
     3 #include <stdio.h>
     4 #include <algorithm>
     5 #include <cmath>
     6 using namespace std;
     7 const double pi=acos(-1);
     8 int R,r,H,t,S;
     9 double h,ans;
    10 double get(int n,double r) {
    11     return 2.0*r*tan(pi/n);
    12 }
    13 
    14 void binary() {
    15     int limit=100000;
    16     for(int i=t; i>=1; i--) {
    17         double rr=1.0*(R-r)/t*(i-1)+r;
    18         int mi=3,ma=limit,mid,num;
    19         double s;
    20         while(mi<=ma) {
    21             mid=(mi+ma)>>1;
    22             double tmp=get(mid,rr)*h;
    23             if(tmp-S>1e-8) {
    24                 s=tmp;
    25                 num=mid;
    26                 mi=mid+1;
    27             } else
    28                 ma=mid-1;
    29         }
    30         ans+=num*s;
    31         limit=num;
    32     }
    33 }
    34 
    35 int main() {
    36     while(~scanf("%d%d%d%d%d",&R,&r,&H,&t,&S)) {
    37         h=(double)H/t,ans=0;
    38         binary();
    39         printf("%.3lf
    ",ans);
    40     }
    41     return 0;
    42 }
    View Code
  • 相关阅读:
    mysql 安装
    flying-saucer-pdf使用中字符串过长换行出问题的解决办法
    杂想
    关于MATLAB实验结果求交点问题
    关于学习方向问题
    关于读取文件夹中的图片问题
    关于ROC曲线的碎碎念
    win7(64)+vs2013+opencv3.0配置的辛酸路程
    验证模式和辨识模式
    指纹识别认证
  • 原文地址:https://www.cnblogs.com/ITUPC/p/5333993.html
Copyright © 2011-2022 走看看