The 36th ACM/ICPC Asia Regional Chengdu Site 1003 Regular Polygon

比賽時悲劇的沒做出來,賽後終於解決了,革命尚未成功,同志仍需努力呀!


#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
const int N=102;
double pi=acos(-1);
const double eps=1e-8;
double dis[N];
int n;
double solve (double l,double r)
{
    if(fabs(l-r)<eps)return -1;
    double mid=(l+r)/2;
    int i;
    double ang=0;
    for(i=0;i<n;i++)
    {
        if(mid-(dis[i]+dis[i+1])>eps)return solve(l,mid);//邊太大,構不成三角形
        if(mid-fabs(dis[i]-dis[i+1])<eps)return solve(mid,r);//邊太小,構不成三角形
        double cs=(dis[i]*dis[i]+dis[i+1]*dis[i+1]-mid*mid)/(2*dis[i]*dis[i+1]);
        ang+=acos(cs);
    }
    if(fabs(ang-2*pi)<eps)return mid;//等於360度
    else if(ang-2*pi>eps)return solve(l,mid);//大於360度,說明mid太大
    else return solve(mid,r);//小於360度說明mid太小
    return -1;
}
int main()
{
    int t;
    cin>>t;
    int ca=1;
    while(t--)
    {
        cin>>n;
        int i;
        for(i=0;i<n;i++)
        {
            scanf("%lf",&dis[i]);
        }
        dis[n]=dis[0];
        double ans=solve (0,20000);
        if(ans==-1)printf("Case %d: impossible\n",ca);
        else printf("Case %d: %.3lf\n",ca,ans);
        ca++;
    }
    return 0;
}
/*
2
3
3.0 4.0 5.0
3
1.0 2.0 3.0
*/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章