这题做的我真是李菊福了
下午做重现的时候一直调不出样例
晚上拉到自己电脑上一跑立马出了样例 哭翔
晚上看了个哥们用二分过的
其实可以不用二分,直接int count = (int )(2*PI/(最小长度对应当前半径的角度))
因为强制转换丢掉了小数部分(余数)
所以就可以得到最多count边形 (再多边长就会小于最小长度了)
最后int cnt=(int )(fullang/angle+eps);//去掉eps就过了 真是菊服
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
double R,r,H,F,S;
const double eps= 1e-9;
const double fullang=2*acos(-1.0);
int dcmp(double x){
if(fabs(x) < eps) return 0; else return x<0? -1:1;
}
int main(){
while(scanf("%lf%lf%lf%lf%lf",&R,&r,&H,&F,&S)!=EOF){
double h=H/F;
double add=(R-r)/F;
double minl=S/h;
double cur=r;
double ans=0;
while(dcmp(cur-R)!=0){
double angle=atan(minl/2/cur)*2;
int cnt=(int )(fullang/angle);
double len= tan(fullang/cnt/2) * cur;
ans+=len*cnt*2;
cur+=add;
}
ans*=h;
printf("%.3lf\n",ans);
}
return 0;
}