zoukankan      html  css  js  c++  java
  • 【好题】思维+几何+弦的圆心角——ICPC GNYR 2019 E

    /*
    两个重要的结论:
        1.将每条边强行移到圆上,如果多边形所有边的圆心角之和=2pi,那么圆心在多边形中;>2pi,那么圆半径太小;<2pi,圆半径太大 
        2.不管按什么顺序摆放边,都不影响多边形的对应其外接圆(如果有)的圆心角之和 
    给定多边形的各边边长,要求构造出一个多边形,使其所有点在外切圆上,且圆心在多边形内,半径<=120 首先是NO CIRCLE:所有边组不成三角形,即最长边>=其余边之和 然后是OUTSIDE:参考钝角三角形,以最长边为直径,如果其他边的圆心角之和<pi,说明圆心必定在多边形外面 然后是TOO BIG: 直接以120为半径,如果所有边圆心角之和==2pi,则符合 然后是二分求最小半径:所有边圆心角之和>2pi,那么半径要扩大,反之要收缩
    */ #include<bits/stdc++.h> using namespace std; #define N 205 #define db double const db pi = acos(-1.0); const db eps = 1e-6; int sign(db x){ if(x>eps)return 1; if(x<-eps)return -1; return 0; } db sum,l[N]; int n; db calc(db r){// 以r为半径,把所有边当成弦,求所有弦对应的圆心角之和 if(sign(l[n]-2*r)>0)return -1; db res=0; for(int i=1;i<=n;i++) res+=asin(l[i]/(2.0*r)); return res*2.0; } int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>l[i]; sort(l+1,l+1+n); for(int i=1;i<n;i++)sum+=l[i]; if(sign(l[n]-sum)>=0){ puts("NO CIRCLE");return 0; } db sumang=calc(l[n]/2); if(sign(sumang-2*pi)<0){ puts("OUTSIDE");return 0; } sumang=calc(120.0); if(sumang==-1 || sign(sumang-2*pi)>0){ puts("TOO BIG");return 0; } db L=l[n]/2,R=120.0,mid,ans; for(int t=1;t<=50;t++){ mid=(L+R)/2; sumang=calc(mid); if(sumang==-1) L=mid; else if(sign(sumang-2*pi)>0) L=mid; else if(sign(sumang-2*pi)<0) R=mid; else ans=mid,R=mid; } printf("%.4lf ",ans); }
  • 相关阅读:
    杭电 2602 Bone Collector
    Log4cpp介绍及使用
    DirectSound的应用
    unity3d 中加入�视频
    Android手机分辨率基础知识(DPI,DIP计算)
    MVC中使用AuthorizeAttribute做身份验证操作
    Java正則表達式入门
    使用Java高速实现进度条
    微软历史最高市值是多少?
    android 怎样内置/预置/预编译文件(运行程序,应用程序,apk, jar, lib 等随意文件)到系统中
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12791242.html
Copyright © 2011-2022 走看看