BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]
1502: [NOI2005]月下柠檬树
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 1070 Solved: 596
[Submit][Status][Discuss]
Description
Input
文件的第1行包含一个整数n和一个实数alpha,表示柠檬树的层数和月亮的光线与地面夹角(单位为弧度)。第2行包含n+1个实数h0,h1,h2,…,hn,表示树离地的高度和每层的高度。第3行包含n个实数r1,r2,…,rn,表示柠檬树每层下底面的圆的半径。上述输入文件中的数据,同一行相邻的两个数之间用一个空格分隔。输入的所有实数的小数点后可能包含1至10位有效数字。
Output
输出1个实数,表示树影的面积。四舍五入保留两位小数。
Sample Input
10.0 10.00 10.00
4.00 5.00
Sample Output
HINT
1≤n≤500,0.3
我一定是在做数学!!!!
%%%Claude画图真好看 http://blog.csdn.net/wzq_qwq/article/details/48310417
把每条线段和每个点的投影找出来,然后计算F函数时遍历所有线段和圆找最大值行了
这里的线保存了k和b,解析几何的感觉
找点和圆的切线用了射影定理,小新讲过然而并不会(因为我只会三角形相似),又去学了一下
概述图中,在Rt△ABC中,∠ABC=90°,BD是斜边AC上的高,则有射影定理如下:BD²=AD·CDAB²=AC·ADBC²=CD·AC
找圆的公切线直接用三角函数....
- //
- // main.cpp
- // bzoj1502
- //
- // Created by Candy on 2017/2/1.
- // Copyright © 2017年 Candy. All rights reserved.
- //
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- using namespace std;
- typedef long long ll;
- const int N=;
- const double INF=1e9;
- const double eps=1e-;
- const double pi=acos(-);
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-; c=getchar();}
- while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
- return x*f;
- }
- inline int sgn(double x){
- if(abs(x)<eps) return ;
- else return x<?-:;
- }
- struct Vector{
- double x,y;
- Vector(double a=,double b=):x(a),y(b){}
- void print(){printf("%lf %lf\n",x,y);}
- };
- typedef Vector Point;
- struct Line{
- Point s,t;
- double k,b;
- Line(){}
- Line(Point a,Point c):s(a),t(c){
- k=(t.y-s.y)/(t.x-s.x);
- b=s.y-k*s.x;
- }
- double f(double x){return k*x+b;}
- }L[N];
- int nl;
- struct Circle{
- double x,r;
- Circle(){}
- Circle(double x,double r):x(x),r(r){}
- }C[N];
- void addCommonTangent(Circle a,Circle b){
- nl++;
- double sina=(a.r-b.r)/(b.x-a.x);
- double cosa=sqrt(-sina*sina);
- double tana=sina/cosa;
- L[nl].s=Point(a.x+a.r*sina,a.r*cosa);
- L[nl].t=Point(b.x+b.r*sina,b.r*cosa);
- L[nl].k=-tana;
- L[nl].b=L[nl].s.y-L[nl].k*L[nl].s.x;
- }
- int n;
- double alpha,h[N],lb=INF,rb;
- inline double F(double x){
- double re=;
- for(int i=;i<=nl;i++) if(x>=L[i].s.x&&x<=L[i].t.x) re=max(re,L[i].f(x));
- for(int i=;i<=n;i++) if(x>=C[i].x-C[i].r&&x<=C[i].x+C[i].r)
- re=max(re,sqrt(C[i].r*C[i].r-(x-C[i].x)*(x-C[i].x)));
- return re;
- }
- inline double cal(double l,double r){
- return (F(l)+F(r)+*F((l+r)/))*(r-l)/;
- }
- double simpson(double l,double r,double now){
- double mid=(l+r)/,p=cal(l,mid),q=cal(mid,r);
- if(abs(now-p-q)<eps) return now;
- else return simpson(l,mid,p)+simpson(mid,r,q);
- }
- Point p;
- int main(int argc, const char * argv[]){
- scanf("%d%lf",&n,&alpha);
- for(int i=;i<=n+;i++) scanf("%lf",&h[i]),h[i]+=h[i-];
- for(int i=;i<=n;i++) scanf("%lf",&C[i].r);
- double ta=tan(alpha);
- p=Point(h[n+]/ta,);
- rb=max(rb,p.x);
- {
- C[n].x=h[n]/ta;
- double x=C[n].x,r=C[n].r;
- lb=min(lb,x-r);
- rb=max(rb,x+r);
- if(x+r<p.x){
- double l=r*r/(p.x-x);//she ying ding li
- double h=sqrt(r*r-l*l);
- L[++nl]=Line(Point(x+l,h),p);
- }
- }
- for(int i=n-;i>=;i--){
- C[i].x=h[i]/ta;
- double x=C[i].x,r=C[i].r;
- lb=min(lb,x-r);
- rb=max(rb,x+r);
- if(sgn(C[i+].x-C[i].x-abs(C[i+].r-C[i].r))>)//d-abs(R-r)<=0 nei han
- addCommonTangent(C[i],C[i+]);
- }
- printf("%.2f\n",*simpson(lb,rb,cal(lb,rb)));
- return ;
- }
BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]的更多相关文章
- [BZOJ 1502] [NOI2005] 月下柠檬树 【Simpson积分】
题目链接: BZOJ - 1502 题目分析 这是我做的第一道 Simpson 积分的题目.Simpson 积分是一种用 (fl + 4*fmid + fr) / 6 * (r - l) 来拟合 fl ...
- 【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分
[BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树 ...
- 【bzoj 1502】月下柠檬树
月下柠檬树 题意 求n个圆与他们的公切线的定积分. 解法 求出圆的公切线就可以了. 特别坑的一点 : 最两端的圆,有可能会被其他的圆所包含,所以要重新求一下最左端与最右端. 比较坑的一点 : 精度要设 ...
- 1502: [NOI2005]月下柠檬树 - BZOJ
Description Input 文件的第1行包含一个整数n和一个实数alpha,表示柠檬树的层数和月亮的光线与地面夹角(单位为弧度).第2行包含n+1个实数h0,h1,h2,…,hn,表示树离地的 ...
- [NOI2005]月下柠檬树(计算几何+积分)
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 索着人生的哲理. 李哲是一个喜爱思考的孩子,当他看 ...
- 1502: [NOI2005]月下柠檬树
一堆圆台平行光的投影 在草稿纸上画一下,发现对于一个圆,它投影完还是一个半径不变的圆. 定义树的轴在投影平面上经过的点为原点,定一个正方向,建立平面直角坐标系, 能发现,对于一个半径为\(r\),高度 ...
- [NOI2005]月下柠檬树[计算几何(simpson)]
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1169 Solved: 626[Submit][Status] ...
- [NOI2005]月下柠檬树
题意 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser autoint Logout 捐赠本站 Probl ...
- 5.21 省选模拟赛 luogu P4207 [NOI2005]月下柠檬树 解析几何 自适应辛普森积分法
LINK:月下柠檬树 之前感觉这道题很鬼畜 实际上 也就想到辛普森积分后就很好做了. 辛普森积分法的式子不再赘述 网上多的是.值得一提的是 这道题利用辛普森积分法的话就是一个解析几何的问题 而并非计算 ...
随机推荐
- c++只能编译无法运行或许缺少命令
-mwindows -lcomctl32 -lwinmm -lws2_32 -lodbc32 -lmysql -lwinspool1.工具-编译选项-编译器-在连接器命令行加入以下命令:-mwin ...
- 010 有顺序的Map的实现类:TreeMap和LinkedHashMap
作者:nnngu GitHub:https://github.com/nnngu 博客园:http://www.cnblogs.com/nnngu 简书:https://www.jianshu.com ...
- 《你不知道的JavaScript上卷》知识点笔记
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } p.p2 { margin: 0.0px ...
- (一)surging 微服务框架使用系列之surging 的准备工作rabbitmq安装
(1)下载erlang: http://www.erlang.org/download/otp_win64_17.3.exe 并安装 (2)下载RabbitMQ: http://www.rabbitm ...
- jdbc、Mybatis插入数据主键回显的实现方法
插入数据的时候,往往需要获取主键值.但是有时候主键是自增长的那么,就不太适用手动添加主键值了,此时需要一种可以回显主键参数的方法, 下面以jdbc.mybatis的实现举例 此时使用的是jdbc的话或 ...
- [拾 得] 一枚迷人的贝壳 SHELL / Linux | shell 脚本初步入门
坚持知识分享,该文章由Alopex编著, 转载请注明源地址: http://www.cnblogs.com/alopex/ 索引: 什么是shell shell的分类 shell脚本的执行方式 ...
- 设置某个类使用或者禁用ARC
设置这个类为ARC的 用:-fobjc-arc 设置这个类非ARC的:-fno-objc-arc 工程是非ARC的,但是引用的第三方类库是ARC的,所以要使用的时候,要单独设置这个第三方的类是A ...
- eclipse中如何同期化
打开MyEclipse8.0help->Software Updates->find and install(如果没有这个就用help->Software Updates->A ...
- IDEA、Matlab 注释
IDEA ctrl+/ 多行代码分行注释,再按一次取消 ctrl+shift+/ 多行代码注释在一个块里,只在开头和结尾有注释符号 Matlab 注释:Ctrl+/ Ctrl+R 取消注释:Ctrl+ ...
- 移动端 -webkit-user-select:text; ios10 bug 解决方案
移动端一般body的css.会设置 作用就不解释了: body{ height:100%;min-height:100%; font-family: "微软雅黑",'Helveti ...