P3680 凸輪廓線
阿新 • • 發佈:2018-12-07
看到這題時,我居然無知的認為這是一道水題,全然不顧那紫色
…
在瘋狂地提交了40遍後,我明白了…
這(tmd)可(hao)真(nan)水…
uses math; var i,j,k:longint; ans:extended; m,n:longint; s:ansistring; l,r:longint; p,t:extended; sum:extended; function half(ch:char):extended; begin if ch='S' then exit(2); if ch='C' then exit(pi/2); if ch='T' then exit(1.5); end; function delta(a,b:extended):extended; var cosA,cosB,cosC,angle,c:extended; begin c:=sqrt(a*a+b*b); cosA:=(b*b+c*c-a*a)/(2*b*c); angle:=arccos(cosA)/pi*180; exit(angle); end;function delta2(a,b:extended):extended; var cosA,cosB,cosC,angle,c:extended; begin c:=sqrt(b*b-a*a); cosA:=(b*b+c*c-a*a)/(2*b*c); angle:=arccos(cosA)/pi*180; exit(angle); end; begin readln(n); readln(s); n:=length(s); ans:=n*2-2; //找第一個不是三角形 l:=1; while (s[l]='T') and (l<n) do inc(l); r:=n; while (s[r]='T') and (r>1) do dec(r); if (l>r) then//全是三角形 begin ans:=n*2+1; write(ans:0:9); exit; end; //一個從前往後,一個從後往前,只講一個。 if l=1 then ans:=ans+half(s[1]) else begin if s[l]='C' then //初二及以下勿看 begin sum:=delta(sqrt(3)*0.5-0.5,l-1)+delta2(sqrt((sqrt(3)*0.5-0.5)*(sqrt(3)*0.5-0.5)+(l-1)*(l-1)-0.25), sqrt((sqrt(3)*0.5-0.5)*(sqrt(3)*0.5-0.5)+(l-1)*(l-1)));//利用三角函式求角度 ans:=ans+1+{切線的特點}sqrt((sqrt(3)*0.5-0.5)*(sqrt(3)*0.5-0.5)+(l-1)*(l-1)-0.25)-(l-1-0.5)+{弧長:}(90-sum)/360*pi; end else //正方形簡單多了 ans:=ans+1+sqrt((1-0.5*sqrt(3))*(1-0.5*sqrt(3))+(l-1-0.5)*(l-1-0.5))-(l-2); end; if r=n then ans:=ans+half(s[n]) else begin if s[r]='C' then begin sum:=delta(sqrt(3)*0.5-0.5,n-r)+delta2(sqrt((sqrt(3)*0.5-0.5)*(sqrt(3)*0.5-0.5)+(n-r)*(n-r)-0.25), sqrt((sqrt(3)*0.5-0.5)*(sqrt(3)*0.5-0.5)+(n-r)*(n-r))); ans:=ans+1+sqrt((sqrt(3)*0.5-0.5)*(sqrt(3)*0.5-0.5)+(n-r)*(n-r)-0.25)-(n-r-0.5)+(90-sum)/360*pi; end else ans:=ans+1+sqrt((1-0.5*sqrt(3))*(1-0.5*sqrt(3))+(n-r-0.5)*(n-r-0.5))-(n-r-1); end; write(ans:0:9); end.//誒,AC了。
在第43次提交時AC…
因為我評了黑題,它黑了