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\n",ans);
40     }
41     return 0;
42 }
View Code

 

posted @ 2016-03-29 18:27  yyblues  阅读(443)  评论(0编辑  收藏  举报