BZOJ 1502 月下柠檬树 simpson积分

本文介绍了一种计算由多个圆形及其共切线形成的梯形投影面积的方法。通过将问题分解为使用Simpson法则进行数值积分的部分,实现了投影面积的有效计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题解:
投在地上的影子是很多圆和两圆公切线组成的梯形的面积并。

PS:圆只要和地面平行,无论光从哪个角度照射,投影都是圆

 

其实应该一开始应先分成若干份做simpson的。。

View Code
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <cmath>
 7 
 8 #define N 520
 9 #define EPS 1e-6
10 
11 using namespace std;
12 
13 int n;
14 double a[N],b[N],af,h,lt,rt;
15 
16 struct C
17 {
18     double x,y,p,q;
19 }c[N];
20 
21 inline int dc(double x)
22 {
23     if(x>EPS) return 1;
24     else if(x<-EPS) return -1;
25     return 0;
26 }
27 
28 inline void read()
29 {
30     scanf("%d%lf",&n,&af);
31     af=1/tan(af);
32     for(int i=1;i<=n+1;i++)
33     {
34         scanf("%lf",&a[i]);
35         h+=a[i]; a[i]=h*af;
36     }
37     lt=a[1];rt=a[n+1];
38     for(int i=1;i<=n;i++)
39     {
40         scanf("%lf",&b[i]);
41         lt=min(lt,a[i]-b[i]);
42         rt=max(rt,a[i]+b[i]);
43     }
44 }
45 
46 inline void calc()
47 {
48     for(int i=1;i<=n;i++)
49         if(a[i+1]-a[i]>fabs(b[i+1]-b[i]))
50         {
51             c[i].x=a[i]+b[i]*(b[i]-b[i+1])/(a[i+1]-a[i]);
52             c[i].y=sqrt(b[i]*b[i]-(c[i].x-a[i])*(c[i].x-a[i]));
53             c[i].p=a[i+1]+b[i+1]*(b[i]-b[i+1])/(a[i+1]-a[i]);
54             c[i].q=sqrt(b[i+1]*b[i+1]-(c[i].p-a[i+1])*(c[i].p-a[i+1]));
55         }
56 }
57 
58 inline double f(double p)
59 {
60     double res=0;
61     for(int i=1;i<=n;i++)
62     {
63         if(fabs(a[i]-p)<b[i]) res=max(res,sqrt(b[i]*b[i]-(a[i]-p)*(a[i]-p)));
64         if(p>c[i].x&&p<c[i].p) res=max(res,c[i].y-(p-c[i].x)*(c[i].y-c[i].q)/(c[i].p-c[i].x));
65     }
66     return res;
67 }
68 
69 inline double simpson(double l,double r,double fl,double fmid,double fr)
70 {
71     return (fl+fr+4*fmid)*(r-l)/6;
72 }
73 
74 inline double rsimpson(double l,double r,double fl,double fmid,double fr)
75 {
76     double p,q,mid,x,y,z;
77     mid=(l+r)/2;
78     p=f((l+mid)/2); q=f((mid+r)/2);
79     x=simpson(l,r,fl,fmid,fr); y=simpson(l,mid,fl,p,fmid); z=simpson(mid,r,fmid,q,fr);
80     if(dc(fabs(x-y-z))==0) return y+z;
81     else return rsimpson(l,mid,fl,p,fmid)+rsimpson(mid,r,fmid,q,fr);
82 }
83 
84 inline void go()
85 {
86     calc();
87     printf("%.2lf\n",2*rsimpson(lt,rt,0,f(lt+rt)/2,0));
88 }
89 
90 int main()
91 {
92     read(),go();
93     return 0;
94 }

 

 

转载于:https://www.cnblogs.com/proverbs/archive/2013/03/02/2940383.html

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值