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
  • 相关阅读:
    进程、线程、协程
    C++内存模型
    动态库dll与静态库lib
    virtual 虚函数表
    C++面试随笔
    alloc()、malloc()、calloc()、realloc()区别及用法
    C/C++ 面试题记录
    VC底层钩子程序在Win7/Vista下无效
    JMeter安装之后修成中文版
    明天开始 新的旅程
  • 原文地址:https://www.cnblogs.com/ITUPC/p/5333993.html
Copyright © 2011-2022 走看看