Gym - 101987G Secret Code (概率+数学积分)
题意:有A,B,C三个人要见面,每个人在[0,S]随机选择一个时间点作为见面时间,先到的那个人要等下一个人来了之后和他确认信息,然后马上就走。
例如,假如A先到,B其次,C最后到,那么A要等B到了之后和B确认完信息,然后A走,B再等C到了和C确认完信息,这样任务就完成了。
现给出A,B,C三人的最长等待时间wa,wb,wc,求任务能完成的概率。
题意等价于给出三条长度分别为wa,wb,wc且左端点在[0,S]内随机取值的线段,求第一条线段与第二条线段相交且第二条线段与第三条线段相交的概率。
假如A先到,B其次,C最后到,那么A的左端点取值范围在[0,S]间,B的左端点取值范围在[A,min(A+wa,S)]间,C的左端点取值范围在[B,min(B+wb,S)]间,因此A,B,C三点的取值空间对应的体积为$\int_{0}^{S}dA\int_{A}^{min(A+wa,S)}min(B+wb,S)dB$,这个积分直接求不大容易,可以用自适应simpson暴力搞一搞(注意要多分几段,确保不会出现观测错误)。由于A,B,C的先后排列顺序一共有6种情况,而且每种情况出现的概率相等,因此对每种情况分别求一下积分,然后除以S^3就是所求概率了。
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef db fun(db);
const db eps=1e-;
const int N=+;
db S,w[],buf[];
int n,p[];
db simpson(db l,db r,fun f) {return (f(l)+f(r)+*f((l+r)/2.0))*(r-l)/6.0;}
db rsimpson(db l,db r,fun f) {
db mid=(l+r)/2.0;
db a=simpson(l,r,f),b=simpson(l,mid,f),c=simpson(mid,r,f);
if(fabs(a-b-c)<eps)return b+c;
return rsimpson(l,mid,f)+rsimpson(mid,r,f);
}
db itg(db l,db r,fun f,int n=) {
db ret=,di=(r-l)/n;
for(db i=l; i<r-eps; i+=di)ret+=rsimpson(i,i+di,f);
return ret;
}
db fC(db x) {return 1.0;}
db fBC(db B0) {return min(B0+w[],S)-B0;}
db fAB(db A0) {return rsimpson(A0,min(A0+w[],S),fBC);}
db eq(db x,db y) {return fabs(x-y)<eps;}
db solve() {return itg(,S,fAB);}
struct P {
db ans;
int i;
bool operator<(const P& b)const {return eq(ans,b.ans)?i<b.i:ans<b.ans;}
} q[N];
int main() {
scanf("%d",&n);
for(int i=; i<n; ++i) {
scanf("%lf%lf%lf%lf",&S,&buf[],&buf[],&buf[]);
db ans=;
for(int i=; i<; ++i)p[i]=i;
do {
for(int i=; i<; ++i)w[i]=buf[p[i]];
ans+=solve();
} while(next_permutation(p,p+));
ans/=S*S*S;
q[i]= {ans,i};
}
sort(q,q+n);
for(int i=; i<n; ++i)printf("%d%c",q[i].i+," \n"[i==n-]);
return ;
}
还有一种比较直观的做法,首先忽略C,画出A,B的分布空间,是一个二维平面上的梯形,如图所示:

接下来考虑C的取值,由于C的取值只与B有关,因此可以根据y轴上的位置来确定C的取值范围。可以发现,在B∈[0,S-wb]时,C的取值范围恒为[B,B+wb],长度恒为wb,而在B∈[S-wb,S]时,C的取值范围是成线性递减的。综上,可以把总的积分划分成V1和V2两个部分,其中V1=wa*wa*wb/2+(S-wa-wb)*wa*wb,V2=wa*wb*wb/2,化简即为(S-(wa+wb)/2)*wa*wb。
#include<bits/stdc++.h>
using namespace std;
typedef double db;
const int N=+;
db S,w[];
int n;
struct P {
db ans;
int i;
bool operator<(const P& b)const {return ans==b.ans?i<b.i:ans<b.ans;}
} q[N];
int main() {
scanf("%d",&n);
for(int i=; i<n; ++i) {
scanf("%lf%lf%lf%lf",&S,&w[],&w[],&w[]);
db ans=;
for(int i=; i<; ++i)
for(int j=i+; j<; ++j)
ans+=(S*-w[i]-w[j])*w[i]*w[j];
ans/=S*S*S;
q[i]= {ans,i};
}
sort(q,q+n);
for(int i=; i<n; ++i)printf("%d%c",q[i].i+," \n"[i==n-]);
return ;
}
Gym - 101987G Secret Code (概率+数学积分)的更多相关文章
- Android Secret Code
我们很多人应该都做过这样的操作,打开拨号键盘输入*#*#4636#*#*等字符就会弹出一个界面显示手机相关的一些信息,这个功能在Android中被称为android secret code,除了这些系 ...
- hdu.1111.Secret Code(dfs + 秦九韶算法)
Secret Code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- Android 编程下的 Secret Code
我们很多人应该都做过这样的操作,打开拨号键盘输入 *#*#4636#*#* 等字符就会弹出一个界面显示手机相关的一些信息,这个功能在 Android 中被称为 Android Secret Code, ...
- The secret code
The secret code Input file: stdinOutput file: stTime limit: 1 sec Memory limit: 256 MbAfter returnin ...
- [swustoj 679] Secret Code
Secret Code 问题描述 The Sarcophagus itself is locked by a secret numerical code. When somebody wants to ...
- 洛谷 P3102 [USACO14FEB]秘密代码Secret Code 解题报告
P3102 [USACO14FEB]秘密代码Secret Code 题目描述 Farmer John has secret message that he wants to hide from his ...
- HDU 1111 Secret Code(数论的dfs)
Secret Code Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- Secret Code
Secret Code 一.题目 [NOIP模拟赛A10]Secret Code 时间限制: 1 Sec 内存限制: 128 MB 提交: 10 解决: 6 [提交][状态][讨论版] 题目描述 ...
- 【微信】根据appid, secret, code获取用户基本信息
function getUserInfo(){ $appid = "yourappid"; $secret = "yoursecret"; $code = $_ ...
随机推荐
- 一加手机刷入第三方Rec
首先阐述一下刷机的整体流程: 备份数据(可选):短信.联系人.通话记录.图片.应用数据的云端同步. 解锁 刷入第三方Recovery(简称Rec). 进入第三方Rec,刷第三方ROM. 刷机成功 解锁 ...
- 思科设备自动退出配置界面、打断命令输入、禁用DNS查询
1.自动退出配置界面 问题及原因:当设备没有被操作,空闲一段时间后,控制台回到初始化界面.控制台默认会话时间为10分钟,过期后跳转初始化界面 解决办法:配置控制台永不超时 Switch(config) ...
- 测试工具/PostMan
1.postman测试上传文件
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
1.nginx 配置模板 server { listen ; client_max_body_size 512M; proxy_set_header Connection ""; ...
- oracle数据库表恢复到特定时间点
某一张表被应用软件里误操作把数据都清空了,现在想恢复到清空之间,比如2013年8月13日14点以前,应该怎样操作? 通过这个问题可以引发一系列的知识点串联. 1.如果开启闪回可以使用闪回表. 怎样查看 ...
- 【C++】A trick I learned:put boilerplate code into constructor of a struct
I learned this trick from hitonanode's submission on AtCoder. The trick is like struct fast_ios { fa ...
- python中super函数的参考
https://rhettinger.wordpress.com/2011/05/26/super-considered-super/ http://wiki.jikexueyuan.com/proj ...
- solr学习笔记-入门
solr学习笔记 1.安装前准备 solr依赖java 8 运行环境,所以我们先安装java.如果没有java环境无法启动solr服务,并且会看到如下提示: [root@localhost solr- ...
- ABCD 谁是小偷
题目: 警察局抓了a,b,c,d 4名偷窃嫌疑犯,其中只有一人是小偷.审问中,a说:“我不是小偷.”b说:“c是小偷.”c说:“小偷肯定是d.”d说:“c在胡说.” 现在已经知道这四人中有三人说的是真 ...
- PHP 网站大数据大流量与高并发 笔记
前端: 1.域名开启cdn 2.大文件使用oss php: 1.模板编译缓存 服务器: 1.负载均衡 数据库: 1.读写分离 待完善