NWERC 2017 G.Glyph Recognition

这篇博客介绍了NWERC 2017竞赛中的一道几何题目,涉及到多边形外接圆半径的二分搜索算法。作者分享了解题思路,通过计算内外多边形的比例来解决问题,并讨论了如何通过优化比值计算来减少精度误差。

链接

http://codeforces.com/gym/101623/attachments

题解

我已经不记得自己上次写几何题是什么时候了
这题思路很简单,就是二分一下多边形外接圆的半径(即原点到一个顶点的距离),然后求出内外两个多边形,作个比就完事了

涨姿势

这题的比值化简之后是 r21r22 r 1 2 r 2 2 ,因为两个数都是正数,所以我们其实可以在比较的过程中先暂且用 r1r2 r 1 r 2 作比,最后输出的时候再平方,减小精度误差

代码

#include <bits/stdc++.h>
#define maxn 1010
#define eps 1e-8
using namespace std;
const double pi=acos(-1);
struct point
{
    double x, y;
    point(){}
    point(double xx, double yy){x=xx,y=yy;}
}p[10], pt[maxn];
struct vec
{
    point pt;
    double x, y;
    vec(){}
    vec(point p1, point p2){pt=p1, x=p2.x-p1.x, y=p2.y-p1.y;}
    vec(double xx, double yy){x=xx,y=yy;}
}v[10];
int N;
double operator*(vec v1, vec v2){return v1.x*v2.y-v2.x*v1.y;}
void init()
{
    int i;
    scanf("%d",&N);
    for(i=1;i<=N;i++)scanf("%lf%lf",&pt[i].x,&pt[i].y);
}
int cnt(int k, double r)
{
    int i, j, c=0;
    for(i=1;i<=k;i++)p[i]=point(r*cos((i-1)*2*pi/k),r*sin((i-1)*2*pi/k));
    for(i=1;i<k;i++)v[i]=vec(p[i],p[i+1]);
    v[k]=vec(p[k],p[1]);
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=k;j++)
        {
            if(vec(pt[i].x-v[j].pt.x,pt[i].y-v[j].pt.y)*v[j]>eps)break;
        }
        if(j>k)c++;
    }
    return c;
}
void work()
{
    int k, i, ANS;
    double S1, S2, ans=-1, l, r, mid, r1, r2;
    for(k=3;k<=8;k++)
    {
        l=eps, r=1e9;
        for(i=1;i<=1000;i++)
        {
            mid=(l+r)/2.0;
            if(cnt(k,mid)==N)r=mid;
            else l=mid;
        }
        r1=l;
        l=eps, r=1e9;
        for(i=1;i<=1000;i++)
        {
            mid=(l+r)/2.0;
            if(cnt(k,mid)!=0)r=mid;
            else l=mid;
        }
        r2=l;
        if(r2/r1>ans+eps)ans=r2/r1, ANS=k;
    }
    printf("%d %.10lf\n",ANS,ans*ans);
}
int main()
{
    init();
    work();
    return 0;
}
Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Font 'PMingLiU' is not mapped to a physical font. Document font PMingLiU is not mapped to a physical font! Glyph "吕" (0x5415) not available in font "Calibri". Glyph "考" (0x8003) not available in font "Calibri". Glyph "虑" (0x8651) not available in font "Calibri". Glyph "将" (0x5c06) not available in font "Calibri". Glyph "来" (0x6765) not available in font "Calibri". Glyph "是" (0x662f) not available in font "Calibri". Glyph "否" (0x5426) not available in font "Calibri". Glyph "建" (0x5efa) not available in font "Calibri". 这是没有对应的字体是吗?那这块怎么处理,我不加字体用本身原有的字体让他们统一可以正常显示吗、
11-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值