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

2 0.7853981633
10.0 10.00 10.00
4.00 5.00

Sample Output

171.97

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·CD
AB²=AC·AD
BC²=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]月下柠檬树 [辛普森积分 解析几何 圆]的更多相关文章

  1. [BZOJ 1502] [NOI2005] 月下柠檬树 【Simpson积分】

    题目链接: BZOJ - 1502 题目分析 这是我做的第一道 Simpson 积分的题目.Simpson 积分是一种用 (fl + 4*fmid + fr) / 6 * (r - l) 来拟合 fl ...

  2. 【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分

    [BZOJ1502][NOI2005]月下柠檬树 Description 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树 ...

  3. 【bzoj 1502】月下柠檬树

    月下柠檬树 题意 求n个圆与他们的公切线的定积分. 解法 求出圆的公切线就可以了. 特别坑的一点 : 最两端的圆,有可能会被其他的圆所包含,所以要重新求一下最左端与最右端. 比较坑的一点 : 精度要设 ...

  4. 1502: [NOI2005]月下柠檬树 - BZOJ

    Description Input 文件的第1行包含一个整数n和一个实数alpha,表示柠檬树的层数和月亮的光线与地面夹角(单位为弧度).第2行包含n+1个实数h0,h1,h2,…,hn,表示树离地的 ...

  5. [NOI2005]月下柠檬树(计算几何+积分)

    题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔 地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思 索着人生的哲理. 李哲是一个喜爱思考的孩子,当他看 ...

  6. 1502: [NOI2005]月下柠檬树

    一堆圆台平行光的投影 在草稿纸上画一下,发现对于一个圆,它投影完还是一个半径不变的圆. 定义树的轴在投影平面上经过的点为原点,定一个正方向,建立平面直角坐标系, 能发现,对于一个半径为\(r\),高度 ...

  7. [NOI2005]月下柠檬树[计算几何(simpson)]

    1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1169  Solved: 626[Submit][Status] ...

  8. [NOI2005]月下柠檬树

    题意 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser  autoint Logout 捐赠本站 Probl ...

  9. 5.21 省选模拟赛 luogu P4207 [NOI2005]月下柠檬树 解析几何 自适应辛普森积分法

    LINK:月下柠檬树 之前感觉这道题很鬼畜 实际上 也就想到辛普森积分后就很好做了. 辛普森积分法的式子不再赘述 网上多的是.值得一提的是 这道题利用辛普森积分法的话就是一个解析几何的问题 而并非计算 ...

随机推荐

  1. [OpenCV学习笔记1][OpenCV基本数据类型]

    CvPoint基于二维整形坐标轴的点typedef struct CvPoint{int x; /* X 坐标, 通常以 0 为基点 */int y; /* y 坐标,通常以 0 为基点 */}CvP ...

  2. 小白的Python之路 day5 模块XML特点和用法

    模块XML的特点和用法 一.简介 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今 ...

  3. WebClient.DownLoadString报错:连接被意外关闭

    调用WebClient的DownLoadString方法调用接口,当数据量比较小的时候(十几条数据)一切正常.后来对方突然放了一千多条数据,然后就报错了:连接被意外关闭. 先是以为是对方接口没有在输出 ...

  4. github设置添加SSH

    很多朋友在用github管理项目的时候,都是直接使用https url克隆到本地,当然也有有些人使用 SSH url 克隆到本地.然而,为什么绝大多数人会使用https url克隆呢? 这是因为,使用 ...

  5. thinkphp开发微信公众号时,验证基本配置提示请求url超时

    原因在index.php入口文件中必须有define('APP_NAME', 'Weixin'); 服务器url:http://bxu2713700584.my3w.com/Weixin/Index/ ...

  6. Redis单机版安装

    1.工具简单介绍 1.博主使用的是Xshell工具 ps:需要设置端口和连接名称,端口一般默认为22,需要的童鞋可以自行百度 2.Redis单机版安装 第一步:安装gcc编译环境 yum instal ...

  7. vue源码入口文件分析

    开发vue项目有段时间了, 之前用angularjs 后来用 reactjs 但是那时候一直没有时间把自己看源码的思考记录下来,现在我不想再浪费这 来之不易的思考, 我要坚持!! 看源码我个人感觉非常 ...

  8. fread读取文件(二进制文件)

    fread()是c库函数,利于移植,使用缓存,效率较read()高. 原型: size_t fread(void *buffer, size_t size, size_t count, FILE * ...

  9. 安卓开发-intent在Activity之间数据传递

    安卓开发-intent在Activity之间数据传递 [TOC] intent实现普通跳转 使用intent的setclass方法,示例(由此界面跳转到NewActivity界面) //使用setOn ...

  10. 2017-07-04(sudo wc sort)

    sudo 作用 root把本来只能超级用户执行的命令,赋予普通用户执行. 添加 运行visudo命令,在文件底部添加信息即可! sudo -l  查看用户可以运行的命令 use1  ALL=(ALL) ...