传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3733
题目大意:有点长不赘述了。
分析:暴力枚举每一层,根据每一层对应的圆的半径,二分计算满足条件的多边形边数最多为多少。
代码:
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define FOR(i,l,r) for(int i=l;i<=r;++i)
#define REP(i,r) for(int i=0;i<r;++i)
#define DWN(i,r,l) for(int i=r;i>=l;--i)
#define db double
#define PI acos(-1.0)
db getlens(db r,int n)
{
return 2 * r * tan(PI / n);
}
int main()
{
//freopen("a","r",stdin);
int R,r,H,F,S;
while(~scanf("%d%d%d%d%d",&R,&r,&H,&F,&S))
{
db r1,h1,l1;
db ans = 0;
int n;
h1 = H * 1.0 / F;
REP(i,F)
{
r1 = h1 * i * (R - r) / (db)(H) + r;
int left = 3,right = 1e9;
while(left <= right)
{
int mid = (left+right) >> 1;
l1 = getlens(r1,mid);
if(l1 * h1 - S < 0)
{
right = mid - 1;
}
else
{
left = mid + 1;
n = mid;
}
}
int mid = (left+right) >> 1;
l1 = getlens(r1,mid);
ans += l1 * h1 * mid;
}
printf("%.3lf\n",ans);
}
return 0;
}