1. 程式人生 > >P3680 凸輪廓線

P3680 凸輪廓線

看到這題時,我居然無知的認為這是一道水題,全然不顧那紫色

在瘋狂地提交了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…

因為我評了黑題,它黑了