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 }