BZOJ 4789: [CERC2016]Convex Contour

xiaoxiao2021-02-28  105

神TM数学题。。。 这种题 还是尽量把自己的代码简单化 特别是讨论部分。。不然烦死你

前后分别搞一下第一个不是三角形的,中间剩下的肯定都是那样了。。 圆形和三角形就用一下三角恒等变换+acos函数就好 (一开始还没想到怎么弄…画画图就好 利用好什么垂直之类的 注意一下 首尾的特殊情况

#include<bits/stdc++.h> using namespace std; inline int read(){ char ch=getchar(); int x=0,f=1; while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();} return x*f; } inline double pf(double x){return x*x;} char c[22]; int main() { int n=read(),i,st; scanf("%s",c+1); double ans; for(i=1;i<=n && c[i]=='T';++i) ; if(i>n){ printf("%.8lf\n",n*2.0+1); return 0; } if(c[i]=='S'){ if(i==1) ans=3.0; else ans=i+2+ sqrt( pf(2-sqrt(3))/4.0+pf(i-1.5) ); if(i==n){printf("%.8lf\n",ans+1.0); return 0;} } if(c[i]=='C'){ if(i==1) ans=acos(-1.0)/2.0+1.0; else{ double u= sqrt( pf(i-1)+pf(sqrt(3)-1)/4.0),o=sqrt(u*u-1/4.0); double s1= (sqrt(3)-1)/2.0/u, c1=(i-1)/u; double s2= o/u, c2=1/2.0/u; ans= i+1.5+o+acos(s1*c2+c1*s2)*0.5; } if(i==n){printf("%.8lf\n",ans-1.0+acos(-1.0)/2.0); return 0;} } st=i; for(i=n;i>0 && c[i]=='T';--i) ; if(c[i]=='S'){ if(i==n){ printf("%.8lf\n",ans+(n-st)*2.0+1); return 0; } ans+= sqrt( pf(2-sqrt(3))/4.0+pf(n-i-0.5) ); ans+= n-i+3 + 2*(i-st-1); printf("%.8lf\n",ans); } else{ if(i==n){ printf("%.8lf\n",ans+(n-st)*2.0-1+acos(-1.0)/2.0); return 0; } double u= sqrt( pf(n-i)+pf(sqrt(3)-1)/4.0),o=sqrt(u*u-1/4.0); double s1= (sqrt(3)-1)/2.0/u, c1=(n-i)/u; double s2= o/u, c2=1/2.0/u; ans+= n-i+2.5+ (i-st-1)*2 +o+acos(s1*c2+c1*s2)*0.5; printf("%.8lf\n",ans); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-51401.html

最新回复(0)