Educational Codeforces Round 87 (Rated for Div. 2)C2 - Not So Simple Polygon Embedding(几何学)

题目:click
题意:在这里插入图片描述也就是正2*n边形的外接正方形的最小边长。

我们可以先拿C1下手,画图画好了问题也就解决一半了。
在这里插入图片描述
先看当n时偶数的时候,正多边形其实也就外接一个圆,外接的正方形在保证了边长等于圆的直径上旋转。其实就可以看出来,所谓的正方形旋转只是在他们分割成的那个2*n个三角形的顶角旋转,一旦旋转过度另一边会牵制,本质就是在 360 2 n \frac{360}{2*n} 的角度中旋转找一个最小的边长,从等于圆直径开始看能都缩小,显然上图就是可以缩小正方形直接重合正八边形的边长即可,可以发现其实是分割的三角形底边的中心点位置。(再者就是其实n为偶数每次n增加都增加了四条边在圆内,保证正多边形,均匀分散在四个角,四个角的基础就是分割成四个直角可以缩小到那。)

在这里插入图片描述
同理分析n为奇数时,旋转角度也是同上的角度,分割的那个三角形角A,如上图此时肯定不能缩小,左右两边已经到顶点了。
在这里插入图片描述接着旋转可以看到可以缩小正方形到正六边形的顶点,会发现只与角A的/2有关,其余限制。在这里插入图片描述在红线位置,收缩的最大及答案。即角A/4。
自己画画图可以感受到,严格的证明还没有证。之后利用正弦定理求解即可。

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int MAXN=262144*2+10;
const double PI=acos(-1.0);
const long double eps=1e-9;
const int MAX=4e4+5;
char s[200100];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,i,j;
        scanf("%d",&n);
        n*=2;
        double a=PI/(1.0*n);
        double temp=0.5/sin(a);//等腰三角形的腰也就是圆的半径
        double c=(PI/2)-(a/2.0);
        double ans=temp*sin(c);
        ans*=2.0;
        printf("%.12lf\n",ans);
    }    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43958964/article/details/106251190