zoukankan      html  css  js  c++  java
  • 农场阳光 (simpson)

    计算若干个圆与一个矩形的面积并

    simpson公式 ans = ( f[l] + f[r] + 4 * f[mid] ) * (r-l) / 6 

     1 uses math;
     2 type arr=record x,y:double; end;
     3 const eps=1e-8;
     4 var a,b,n,i:longint;
     5     sl,sr,sm:double;
     6     T:array[0..100] of record x,y,z,r:double; end;
     7     f:array[0..100] of arr;
     8     g:double;
     9 function sum(sl,sr,sm,l,r:double):double;
    10 begin
    11     exit((sl+sr+4*sm)*(r-l)/6);
    12 end; 
    13 procedure sort(l,r:longint);
    14 var i,j:longint; x,y:double;
    15     temp:arr;
    16 begin
    17     i:=l;j:=r;x:=f[(i+j) div 2].x; y:=f[(i+j) div 2].y;
    18     while i<=j do
    19     begin
    20         while (f[i].x<x) or (f[i].x=x) and (f[i].y<y) do inc(i);
    21         while (x<f[j].x) or (x=f[j].x) and (y<f[j].y) do dec(j);
    22         if i<=j then
    23         begin
    24             temp:=f[i]; f[i]:=f[j]; f[j]:=temp;
    25             inc(i); dec(j);
    26         end;
    27     end;
    28     if l<j then sort(l,j);
    29     if i<r then sort(i,r);
    30 end;
    31 function calc(xx:double):double;
    32 var i,j,k:longint;
    33     cnt,yy:double;
    34 begin
    35     k:=0;
    36     for i:=1 to n do 
    37         if abs(T[i].x-xx)+eps<T[i].r then
    38         begin
    39             yy:=sqrt(sqr(T[i].r)-sqr(T[i].x-xx));
    40             inc(k);
    41             f[k].x:=T[i].y-yy;
    42             f[k].y:=T[i].y+yy;
    43         end;
    44     sort(1,k);
    45     i:=1; cnt:=0;
    46     //if xx=a/2 then writeln(f[1].x:4:2,f[1].y:4:2);
    47     while i<=k do
    48     begin
    49         j:=i;
    50         while (j<k) and (f[j+1].x<=f[i].y) do
    51         begin
    52             inc(j);
    53             if f[j].y>f[i].y then f[i].y:=f[j].y;
    54         end;
    55         if not ((f[i].y<0) or (f[i].x>b)) then
    56         begin
    57             if (f[i].y<=b) and (f[i].x>=0) then cnt:=cnt+f[i].y-f[i].x else
    58             if (f[i].y>b)  and (f[i].x<0)  then cnt:=cnt+b else
    59             if (f[i].y>b) then cnt:=cnt+b-f[i].x else
    60             if (f[i].x<0) then cnt:=cnt+f[i].y;
    61         end;        
    62         i:=j+1;
    63     end;
    64     exit(cnt);
    65 end;
    66 function simpson(l,r,mid,sl,sr,sm,w:double):double;
    67 var sm1,sm2,m1,m2,w1,w2:double;
    68 begin
    69     m1:=(l+mid)/2;
    70     m2:=(r+mid)/2;
    71     sm1:=calc(m1);
    72     sm2:=calc(m2);
    73     w1:=sum(sl,sm,sm1,l,mid);
    74     w2:=sum(sm,sr,sm2,mid,r);
    75     if abs(w1+w2-w)<eps then exit(w);
    76     exit(simpson(l,mid,m1,sl,sm,sm1,w1)+simpson(mid,r,m2,sm,sr,sm2,w2));
    77 end;
    78 begin
    79     assign(input,'sun.in');reset(input);
    80     assign(output,'sun.out');rewrite(output);
    81     readln(a,b);
    82     readln(g);
    83     readln(n);
    84     for i:=1 to n do 
    85     begin
    86         readln(T[i].x,T[i].y,T[i].z,T[i].r);
    87         T[i].x:=T[i].x+cos(g/180*pi)/sin(g/180*pi)*T[i].z;
    88     end;
    89     sl:=calc(0); sr:=calc(a); sm:=calc(a/2);
    90     //writeln(sl:4:2,' ',sr:4:2,' ',sm:4:2);
    91     writeln(a*b-simpson(0,a,a/2,sl,sr,sm,sum(sl,sr,sm,0,a)):0:2);
    92     close(input);
    93     close(output);
    94 end.
  • 相关阅读:
    ipvsadm命令介绍
    转载-lvs-dr模式+keepalived双机
    Codeforces Round #426 (Div. 2)
    Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)
    Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)
    Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)
    Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)
    Codeforces Round #425 (Div. 2)
    Codeforces Round #425 (Div. 2)
    Codeforces Round #425 (Div. 2)
  • 原文地址:https://www.cnblogs.com/rpSebastian/p/4550188.html
Copyright © 2011-2022 走看看