bzoj 1502 计算几何
来源:互联网 发布:步步高v205软件java 编辑:程序博客网 时间:2024/05/16 13:38
计算几何就是麻烦,
我只想学学辛普森函数和自适应辛普森算法,
计算几何其他内容。。。就理性放弃吧。。。。。。
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#define pow2(x) ((x)*(x))const int MAXN = 600 ,INF = 1<<30;const double eps = 0.0000001;int n ; double alpha;double r0[MAXN] = {0};double h[MAXN] = {0};struct circle{double x,r;}c[MAXN] = {0};struct line{double x1,x2,y1,y2;}l[MAXN] = {0};int dcmp(const double &x){ if(fabs(x) < eps)return 0; else if(x > 0) return 1; else return -1;}double f(double x){ double h = 0; for(int i = 1 ;i <= n ;i++) { if(c[i].x - c[i].r <= x && x <= c[i].x + c[i].r) { h = std::max(h , sqrt(pow2(c[i].r) - pow2(c[i].x - x))); } if(i < n && l[i].x1 <= x && x <= l[i].x2) { h = std::max(h , l[i].y1+(x-l[i].x1)*(l[i].y2-l[i].y1)/(l[i].x2-l[i].x1)); } } return h;}double simpson(const double &fl,const double &fm,const double &fr,const double &l,const double &r){return (r - l)*(fl + 4*fm + fr)/6;}double fun_simpson(const double fll,const double fm ,const double frr ,const double ll ,const double rr){ double m = (ll + rr)/2 , lm = (ll + m)/2, mr = (m + rr)/2, flm = f(lm),fmr = f(mr); double s = simpson(fll,fm,frr,ll,rr) ; double sl = simpson(fll,flm,fm,ll,m) ; double sr = simpson(fm,fmr,frr,m,rr); if(dcmp(s - (sl + sr)) != 0) { sl = fun_simpson(fll,flm,fm,ll,m); sr = fun_simpson(fm,fmr,frr,m,rr); s = sl + sr; } return s;}int main(){ double ans = 0, ll = INF, rr = -INF , mid;#ifndef ONLINE_JUDGE freopen("bzoj1502.in","r",stdin); freopen("bzoj1502.out","w",stdout);#endif scanf("%d",&n); n = n + 1; scanf("%lf",&alpha); for(int i = 1 ; i <= n ;i++) { scanf("%lf", &h[i]); h[i] += h[i-1]; } for(int i = 1 ; i < n ;i++) scanf("%lf", &r0[i]); for(int i = 1 ; i <= n ;i++) { c[i].r = r0[i]; c[i].x = h[i] / tan(alpha); ll = std::min(ll ,c[i].x - c[i].r); rr = std::max(rr ,c[i].x + c[i].r); } for(int i = 1 ; i < n ;i++) { l[i].x1 = c[i].x + c[i].r*(c[i].r-c[i+1].r)/(c[i+1].x-c[i].x); l[i].y1 = sqrt(pow2(c[i].r) - pow2(l[i].x1-c[i].x)); l[i].x2 = c[i+1].x + c[i+1].r*(c[i].r-c[i+1].r)/(c[i+1].x-c[i].x); l[i].y2 = sqrt(pow2(c[i+1].r) - pow2(l[i].x2-c[i+1].x)); } mid = (ll + rr)/2; ans = fun_simpson(f(ll),f(mid),f(rr),ll,rr)*2; printf("%.2lf",ans);#ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout);#endif return 0;}
0 0
- bzoj 1502 计算几何
- bzoj 1020 计算几何
- bzoj 2829 计算几何
- bzoj 3170 计算几何 && bzoj 1604 计算几何+SBT维护
- BZOJ 2146 Construct 计算几何
- BZOJ 1502 计算几何+自适应Simpson积分 解题报告
- [BZOJ]1069: [SCOI2007]最大土地面积 计算几何
- 【BZOJ】【POI2007】【对称轴osi】【题解】【计算几何】
- BZOJ 2338 HNOI2011 数矩形 计算几何
- BZOJ 1027 JSOI2007 合金 计算几何+Floyd
- BZOJ 1132 POI 2008 Tro 计算几何
- BZOJ 1132 POI2008 Tro 计算几何
- BZOJ 2823 AHOI2012 信号塔 计算几何
- BZOJ 1094 ZJOI2007 粒子运动 计算几何
- BZOJ 1132 [POI2008]Tro 计算几何
- bzoj 1020 安全的航线|计算几何
- BZOJ 1132: [POI2008]Tro|计算几何
- bzoj 1027 [JSOI2007]合金 计算几何+floyd
- 仿照QQ菜单
- 实用数据结构---线段树(超详细讲解)
- Castle学习系列(五)---ActiveRecord事务
- 2015-03-09数据加载、存储与文件格式(2)
- 用余下的青春尽力飞翔
- bzoj 1502 计算几何
- 修复ubuntu14的引导
- iOS8中设置应用程序图标跟之前没有什么变化
- hibernate.cfg.xml中信息详解
- 定义a:link、a:visited、a:hover、a:active
- 【Sql Server学习】Sql Server基础第一篇
- 【Linux】solaris 10系统常用命令收集
- poj 2785 4 values whose sum is 0
- error:105 Access denied for user 'root'@'localhost' (using password:YES)