题意:在一个三维空间中有一个轴,轴上有一个垂直于轴的半径为$R$的凸透镜(光心在轴上)和$n$个点光源,假设每个点光源发出的$1$单位光都刚好覆盖凸透镜,现在有一个半径为$r$的圆形光屏,问光屏最多能接收到多少单位光

首先当光屏与轴垂直且圆心在轴上时才能取到最优解

显然当$r\geq R$时答案是$n$

设光心的坐标为$0$,$n$个点光源的坐标为$x_{1\cdots n}(x_i\lt0)$,成像在$u_{1\cdots n}$处,光屏的坐标为$x(x\geq0)$,考虑每个点光源有多少光照到光屏上

对于第$i$个点光源,如果$x_i=-f$,那么$u_i=+\infty$,光线经过透镜后平行于轴,贡献为$\left(\dfrac rR\right)^2$

如果$x_i\ne-f$,那么$u_i=\dfrac1{\frac1f-\frac1{x_i}}$,贡献为$g_i(x)=\min\left(\left(\dfrac{u_ir}{(u_i-x)R}\right)^2,1\right)$,这玩意儿随$x$变化的图像大概长这样

(青蛙子???)

以所有红点为端点把$x$分段,那么所有$g_i(x)$在每一段的二阶导数都是连续且$\geq0$的,所以$\begin{align*}\sum\limits_{i=1}^ng_i(x)\end{align*}$在每一段都是凹的,也就是说最大值只可能在这些点上取到,直接枚举这些点,计算答案取最大值即可

最后还要和$x=0$的答案取$\max$,因为如果光线发散,光屏越靠近凸透镜答案越大

#include<stdio.h>
typedef double du;
const du eps=1e-7;
int x[1010],n,f,R,r;
du u[1010];
du min(du a,du b){return a<b?a:b;}
du max(du a,du b){return a>b?a:b;}
du abs(du x){return x>0?x:-x;}
du sqr(du x){return x*x;}
du calc(du t){
	int i;
	du res;
	res=0;
	for(i=1;i<=n;i++){
		if(x[i]==-f)
			res+=r*r/du(R*R);
		else if(abs(u[i]-t)>eps)
			res+=min(sqr(u[i]*r/du((u[i]-t)*R)),1);
		else
			res+=1.;
	}
	return res;
}
int main(){
	int i;
	du ans;
	scanf("%d%d%d%d",&n,&f,&R,&r);
	if(r>=R){
		printf("%d",n);
		return 0;
	}
	for(i=1;i<=n;i++){
		scanf("%d",x+i);
		if(x[i]!=-f)u[i]=1./(1./du(f)+1./du(x[i]));
	}
	ans=calc(0);
	for(i=1;i<=n;i++){
		if(x[i]<-f)ans=max(ans,max(calc(u[i]*(R-r)/du(R)),calc(u[i]*(R+r)/du(R))));
	}
	printf("%.7lf",ans);
}

[Contest20180418]物理竞赛的更多相关文章

  1. [Contest20180418]数学竞赛

    题意:初始时$x=0$(长度),当$x$为长度时,你可以把$x$变成$\sin^{-1}x,\cos^{-1}x,\tan^{-1}x$之一($x$变为角度),若$x$为角度,你可以把$x$变成$\s ...

  2. C语言中,头文件和源文件的关系(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

  3. Support Vector Machine (3) : 再谈泛化误差(Generalization Error)

    目录 Support Vector Machine (1) : 简单SVM原理 Support Vector Machine (2) : Sequential Minimal Optimization ...

  4. C语言中.h和.c文件解析(很精彩)

    C语言中.h和.c文件解析(很精彩)   简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析 ...

  5. C语言中.h和.c文件解析

    整理自C语言中.h和.c文件解析(很精彩) Part.1(林锐<高质量C/C++编程>) 通过头文件来调用库功能.在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的 ...

  6. PKUSC2016滚粗记

    Day0 坐飞机来北京,地铁上接到电话,以为是诈骗电话马上就挂了,然后看了一下是北京的电话,赶脚有点不对...打回去居然是报到处老师的电话..走了几个小时,到勺园和其他学校的神犇合住.TAT,感觉第二 ...

  7. C语言中头文件和cpp文件解析

    务必提前预读这里的内容:http://www.cnblogs.com/stemon/p/3999844.html 回到cpp文件与头文件各写什么内容的话题上: 理论上来说cpp文件与头文件里的内容,只 ...

  8. 关于ACM,关于CSU

    原文地址:http://tieba.baidu.com/p/2432943599 前言: 即将进入研二,ACM的事情也渐渐远去,记忆终将模糊,但那段奋斗永远让人热血沸腾.开个贴讲讲ACM与中南的故事, ...

  9. 1121: [POI2008]激光发射器SZK

    1121: [POI2008]激光发射器SZK Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 574  Solved: 475[Submit][Sta ...

随机推荐

  1. Python基础简介与简单使用

    Python介绍 Python发展史 1989年,为了打发圣诞节假期,Guido开始写Python语言的编译器.Python这个名字,来自Guido所挚爱的电视剧Monty Python’s Flyi ...

  2. try-catch-finally容易犯的错误

    测试环境 JDK1.8 1. catch中包含return //有return的时候 输出13423 //无return的时候 输出134234 public class Trycatch { pub ...

  3. python作业:HAproxy配置文件操作(第三周)

    一.作业需求: 1. 根据用户输入输出对应的backend下的server信息 2. 可添加backend 和sever信息 3. 可修改backend 和sever信息 4. 可删除backend ...

  4. NodeJs03 express框架 Todo商城

    前言 由于NodeJs本身的异步非阻塞特性和对http的天然支持,所以使用NodeJs编写高性能,可伸缩的Web服务器非常简单.开发完整的Web服务器还需要路由,错误处理,请求拦截,请求和响应的解析, ...

  5. java的四种内部类(转)

    一般来说,有4中内部类:常规内部类.静态内部类.局部内部类.匿名内部类. 一.常规内部类:常规内部类没有用static修饰且定义在在外部类类体中.  1.常规内部类中的方法可以直接使用外部类的实例变量 ...

  6. 软工实践Alpha冲刺(9/10)

    v队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 已经解决登录注册等基本功能的界面. 完成非功能的主界面制 ...

  7. 【bzoj4818】[Sdoi2017]序列计数 矩阵乘法

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825132.html 题目描述 Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的 ...

  8. POJ 3304 Segments | 线段相交

    #include<cstdio> #include<algorithm> #include<cstring> #define N 105 #define eps 1 ...

  9. Hash表模板

    namespace Hash { ; ; struct adj { ll nxt,v,num,val; }e[N]; ll head[H],ecnt=; void init() { ecnt=; me ...

  10. ACdream 1023 抑或

    Xor Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statisti ...