【计算几何】【辛普森积分法】UVALive - 7076 - Highway
春节前后想了好久才在队友的讲解下想明白……
太难讲了,我就不讲了,大概就是考虑直着走到高速上还是斜着走到高速上,然后平移直线和大圆相切,把生成的最大的“桥”和大圆并一下就行了。
#include<cstdio>
#include<cmath>
using namespace std;
#define EPS 0.00000000001
const double PI=acos(-1.0);
double v0,v1,D,T;
double x0,R,x3,x1,Y1,k,b,A,B,C,x2,y2,k2,b2;
double f(double x)
{
return k*x+b-(sqrt(R*R-x*x)-D);
}
double area(double l,double r)
{
return (r-l)/6.0*(f(l)+4.0*f((l+r)/2.0)+f(r));
}
double Sinp(double l,double r)
{
double m=(l+r)*0.5;
double t2=area(l,r),t3=area(l,m)+area(m,r);
if(fabs(t2-t3)<EPS)
return t2;
return Sinp(l,m)+Sinp(m,r);
} double g(double x)
{
return -sqrt(R*R-x*x)+D;
}
double are2(double l,double r)
{
return (r-l)/6.0*(g(l)+4.0*g((l+r)/2.0)+g(r));
}
double Sin2(double l,double r)
{
double m=(l+r)*0.5;
double t2=are2(l,r),t3=are2(l,m)+are2(m,r);
if(fabs(t2-t3)<EPS)
return t2;
return Sin2(l,m)+Sin2(m,r);
} double w(double x)
{
return -sqrt(R*R-x*x)-D-(k*x+b);
}
double are3(double l,double r)
{
return (r-l)/6.0*(w(l)+4.0*w((l+r)/2.0)+w(r));
}
double Sin3(double l,double r)
{
double m=(l+r)*0.5;
double t2=are3(l,r),t3=are3(l,m)+are3(m,r);
if(fabs(t2-t3)<EPS)
return t2;
return Sin3(l,m)+Sin3(m,r);
} double sqr(double x)
{
return x*x;
}
int main()
{
//freopen("a.in","r",stdin);
int zu=0;
while(scanf("%lf%lf%lf%lf",&v0,&v1,&D,&T)!=EOF)
{
++zu;
x0=-D*v1/v0+v1*T;
R=v0*T;
x3=sqrt(R*R-D*D);
x1=sqr(T*v0-D)/x0;
Y1=sqrt(sqr(T*v0-D)-x1*x1);
k=Y1/(x1-x0);
b=R*sqrt(1.0+k*k)-D;
x0=-b/k;
k2=-1.0/k;
b2=-D;
A=1.0+k2*k2;
B=2.0*(b2+D)*k2;
C=sqr(b2+D)-R*R;
x2=(-B+sqrt(B*B-4.0*A*C))/(2.0*A);
y2=k*x2+b;
if(y2<EPS)
{
printf("Case %d: %.8lf\n",zu,PI*R*R);
continue;
}
double __area=Sinp(x2,x3)+(x0-x3)*(k*x3+b)*0.5; k=-k;
b=-b;
A=1.0+k*k;
B=2.0*(b+D)*k;
C=sqr(b+D)-R*R;
x2=(-B+sqrt(B*B-4.0*A*C))/(2.0*A);
y2=k*x2+b;
if(y2+D>(-EPS))
__area+=(Sin2(x3,x2)+(x0-x2)*(k*x2+b)*(-0.5));
else
__area+=(Sin2(x3,R)+Sin3(x2,R)+(x0-R)*(k*R+b)*(-0.5));
printf("Case %d: %.8lf\n",zu,__area*2.0+PI*R*R);
}
return 0;
}
【计算几何】【辛普森积分法】UVALive - 7076 - Highway的更多相关文章
- 5.21 省选模拟赛 luogu P4207 [NOI2005]月下柠檬树 解析几何 自适应辛普森积分法
LINK:月下柠檬树 之前感觉这道题很鬼畜 实际上 也就想到辛普森积分后就很好做了. 辛普森积分法的式子不再赘述 网上多的是.值得一提的是 这道题利用辛普森积分法的话就是一个解析几何的问题 而并非计算 ...
- BZOJ2178 圆的面积并 计算几何 辛普森积分
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2178.html 题目传送门 - BZOJ2178 题意 给出 $n(n\leq 1000)$ 个圆,求 ...
- UVALive 3835:Highway(贪心 Grade D)
VJ题目链接 题意:平面上有n个点,在x轴上放一些点,使得平面上所有点都能找到某个x轴上的点,使得他们的距离小于d.求最少放几个点. 思路:以点为中心作半径为d的圆,交x轴为一个线段.问题转换成用最少 ...
- 计算科学(转自wiki)
计算科学(也称科学计算 scientific computation 或 SC)是一个快速增长的多学科领域,使用先进的计算能力来理解和解决复杂的问题. 计算科学包括三个不同的方面: 1. 开发用于解决 ...
- ZOJ 3898 - Stean 积分
有一个陶罐,陶罐是由函数Y=2+cosX,截取x=Z1到x=Z2段后,形成的旋转体,陶罐只有底x=Z1,没有盖子. 问陶罐能乘多少的水(体积),以及它的表面积 体积还是比较好求的,直接用旋转体体积公式 ...
- R语言数值积分
前两天对学习了R里面计算的基本范围,以及一些求解方程的方法,今天来看看积分,其实上个学期学了数值分析,对这部分的算法是有所了解的,当时是用matlab写了一遍,已经忘了怎么实现的了,现在用R重新写一遍 ...
- [CSU1806]Toll
题目:Toll 传送门:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1806 题目简述:给定n个点m条有向边的有向图,每条边的花费是$b_i ...
- Simpson公式的应用(HDU 1724/ HDU 1071)
辛普森积分法 - 维基百科,自由的百科全书 Simpson's rule - Wikipedia, the free encyclopedia 利用这个公式,用二分的方法来计算积分. 1071 ( T ...
- UVALIVE 5893 计算几何+搜索
题意:很复杂的题意,我描述不清楚. 题目链接:http://acm.bnu.edu.cn/bnuoj/contest_show.php?cid=3033#problem/33526 大致是,给定一个起 ...
随机推荐
- 本地上jar命令
1.上传到jd-release mvn deploy:deploy-file -DgroupId=com.jd.open.api -DartifactId=open-api-sdk -Dversion ...
- iOS 后台运行执行代码(例如定位)
- 图片上传是否为空,以及类型的js验证
function check2() { var file = document.getElementsByName("file").value; if(file=="&q ...
- Spring - IoC(6): 作用域
Spring 支持五种作用域,分别是 singleton.prototype.request.session 和 global session. 作用域 说明 singleton (默认作用域)单例 ...
- cygwin与vim配置
参考 http://www.jeepshoe.org/810958442.htm cygwin安装包管理器 通过终端安装apt-cyg之前选要安装以下软件包wget tar gawk bzip2 ap ...
- PHP代码中input控件使用id无法POST传值,使用name就可以
<html> <head> <title>Example</title> </head> <body> <?php if ...
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- hrtimer的简单使用 + 原理和实现【转】
转自:http://blog.csdn.net/beyondioi/article/details/9212795 1.hrtimers - 为高分辨率kernel定时器,可作为超时或周期性定时器使用 ...
- StringUtils工具类的使用
注意isNotEmpty()和isNotBlank()的区别 过去的字符串判空:if("".equals(str) || str == null).现在使用工具类StringUti ...
- php扩展
swoole 命令行/php-fpm下实现的 多线程.异步.多种网络协议等 https://wiki.swoole.com/wiki/page/6.html 编译安装, 注意:需命令行运行,作为内部服 ...