【计算几何】【辛普森积分法】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;
}
时间: 2024-10-12 11:13:35

【计算几何】【辛普森积分法】UVALive - 7076 - Highway的相关文章

UVALive 3835:Highway(贪心 Grade D)

VJ题目链接 题意:平面上有n个点,在x轴上放一些点,使得平面上所有点都能找到某个x轴上的点,使得他们的距离小于d.求最少放几个点. 思路:以点为中心作半径为d的圆,交x轴为一个线段.问题转换成用最少的店覆盖所有的线段.经典贪心.按右点从小到大排序,然后从左往右扫,每次选择区间右点就行了. 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using

hdu 1071 The area 高斯消元求二次函数+辛普森积分

构造系数矩阵,高斯消元求解二次函数,然后两点式求直线函数,带入辛普森积分法无脑AC... #include<cstdio> #include<queue> #include<algorithm> #include<cstring> #include<vector> #include<cmath> using namespace std; struct node { double x,y; }p[4]; double g[10][10]

计算科学(转自wiki)

计算科学,又称科学计算,是一个与数学模型构建.定量分析方法以及利用计算机来分析和解决科学问题相关的研究领域.在实际应用中,计算科学主要应用于:对各个科学学科中的问题,进行计算机模拟和其他形式的计算. 这一领域不同于计算机科学(对于计算.计算机以及信息处理的研究),同时也异于科学和工程学的传统形式--理论与实验.科学计算技术要想获得理解,主要需要通过在计算机上实现的数学模型进行分析. 科学家和工程师发展了计算机程序和应用软件,来为被研究的系统创建模型,并以多种输入参数运行这些程序.一般来说,这些模

ZOJ 3898 - Stean 积分

有一个陶罐,陶罐是由函数Y=2+cosX,截取x=Z1到x=Z2段后,形成的旋转体,陶罐只有底x=Z1,没有盖子. 问陶罐能乘多少的水(体积),以及它的表面积 体积还是比较好求的,直接用旋转体体积公式,pi*∫[z1,z2](2+cosX)2dX=  pi* ( 4sinX+sin2X/4+9X/2 | [z1,z2] ) 比较难求的是表面积,套用旋转体侧面积公式,2pi*∫[z1,z2](2+cosX)*sqrt(1+sin2X)dX 然而这个积分相当难求(好像是第二类椭圆积分),我们需要用辛

acdream 1234 Two Cylinders

Two Cylinders Special JudgeTime Limit: 10000/5000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticNext Problem Problem Description In this problem your task is very simple. Consider two infinite cylinders in three-dimensional

[CSU1806]Toll

题目:Toll 传送门:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1806 题目简述:给定n个点m条有向边的有向图,每条边的花费是$b_i * t +d_i$,设f(t)表示给定t的时候1-n的最小花费,求:${\frac{\int_0^T{f(t)dt}}{T}}$ 分析: (1)f(t)可用最短路求出来. (2)积分值可用自适应辛普森积分法计算. 注意:有向图! 代码: #include <cstdio> #include <

BZOJ 1502 NOI 2005 月下柠檬树 计算几何 自适应辛普森积分

题目大意:有一个由圆锥和圆台组成的柠檬树,在月亮发出的平行光下,可以形成一个影子,求这个影子的面积. 思路:理解投影的性质:只要是平行光线,投影在水平面上,所得的图形都与原图形全等. 知道了这一点我们就可以画画图,分析就知道,其实柠檬树的影子,就是一些园和等腰梯形的面积的并.(如下图,样例) 运用计算几何的知识就可以得到圆的方程和圆的公切线的方程,然后得到一个连续的函数.最后这个题就成为一直函数的解析式,求这个函数与X轴之间的面积. 套用辛普森积分:Simpson(l,r) = (F(l) +

UVALive - 3263 - That Nice Euler Circuit (计算几何~~)

UVALive - 3263 That Nice Euler Circuit Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Little Joey invented a scrabble machine that he called Euler, after the great mathematician. In his primary sch

UVAlive 7366 Brocard(二分+计算几何)

题目地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5388 思路:二分Brocard angle设为rad,将两条边(AB,BC)按该角度旋转,求出两条边的交点P,判断CA与CP所成角度ang是否等于该角度,若rad>ang则rad应减小(r=mid),即使得ang变大,否则rad应增大(l=mid),直到两者相